2015-11-22 8 views
5

Próbuję ponownie napisać mój projekt czasu wolnego z Javy do Kotlin (aby go zrozumieć) i napotkałem kilka problemów. Badania przyniósł mi do { function() } ale to mi nie pomagaAnonimowe zajęcia z lambdami w Kotlin

w Javie Mam ten interfejs:

public interface Shuffling<T> { 

    List<T> shuffle(List<T> list, ShuffleCallback callback); 

    interface ShuffleCallback { 
    void onShuffle(int addedTo, int randomIndex); 
    } 
} 

I Próbuję dodać obiekt testowy do listy algorytmów tasowania w Kotlin:

val algoList = ArrayList<Shuffling<Int>>() 
algoList.add(Shuffling { list, callback -> { 
    Timber.d("Test!") 
    ArrayList<Int>() // how to return this value? 
}}) 

First trouble

Jak dodać kilka linii do funkcji lambda?

Mam także inny przykład z kłopotów: Interfejs

Kotlin:

interface Drawable { 
    fun draw() 
} 

i wdrożenie Kotlin:

private val drawList = ArrayList<Drawable>() 

//... 
drawList.add(Drawable {glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)}) 

Second trouble

Wcześniej używałem tylko:

mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)); 

I wszystko było w porządku.

Odpowiedz

6

OK, więc tutaj są szybkie poprawki:

Na pierwsze pytanie: proszę usunąć „internal” parę wsporników z lambda. Teraz Twój kod zwraca nie ArrayList<Int>(), ale funkcja, która zwraca listę (przy wywołaniu)

Na drugie pytanie: trick, który został użyty w swoim pierwszym pytaniu nazywa konwersja SAM i pracuje tylko dla interfejsów Java być spójne z java8. Twój Drawable jest zdefiniowana w Kotlin, więc nie czarna magia dostępny, trzeba utworzyć instancję i przekazać go:

drawList.add(object: Drawable { 
    override fun draw() = glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices) 
}) 

uzyskać więcej informacji prosimy o zapoznanie się: https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

PS nie trzeba używać Shuffling przed lambda. Nie jest tu potrzebny (chyba) i bardzo komplikuje kod.

+0

Próbowałem utworzyć tasowanie lambda, aby przetestować działanie lambdas w kotlinach. –

+0

@AntonShkurenko czy to działa? – voddan

+0

1) Czy mogę dodać wiele linii? Ostatni wiersz zwróci wartość? Ale co jeśli użyję jeśli/else? 2) Jeśli ponownie napiszę interfejs do interfejsu java, będę mógł używać lamdas? Albo jak to zrobić z Kotlinem? Naprawdę lubię nie pisać tego obiektu, przesłonić, itp. –