2015-11-22 17 views
5

Sto provando a riscrivere il mio progetto di tempo libero da Java a Kotlin (per capirlo) e ho incontrato alcuni problemi. Le ricerche mi hanno portato a { function() } ma non mi ha aiutatoClassi anonime con lambda a Kotlin

In Java ho questa interfaccia:

public interface Shuffling<T> { 

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

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

E sto cercando di aggiungere oggetto di prova nella lista algoritmi strascicati in Kotlin:

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

First trouble

Come aggiungere più righe alla funzione di lambda?

Anche io ho un altro esempio con problemi: l'interfaccia

Kotlin:

interface Drawable { 
    fun draw() 
} 

e l'attuazione Kotlin:

private val drawList = ArrayList<Drawable>() 

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

Second trouble

In precedenza ho usato solo:

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

E tutto andava bene.

risposta

6

OK, quindi ecco le soluzioni rapide:

Per la vostra prima domanda: si prega di rimuovere la coppia di "interno" di staffe dal lambda. Ora il vostro codice restituisce non ArrayList<Int>(), ma una funzione che restituisce la lista (una volta invocato)

Per la seconda domanda: il trucco che si è utilizzato nella vostra prima domanda chiamato conversione SAM e funziona solo per le interfacce Java siano coerenti con java8. Il tuo Drawable è definito in Kotlin, quindi nessuna magia nera a disposizione, è necessario creare un'istanza e passarlo:

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

per maggiori informazioni si prega di leggere: https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

PS non devi usare Shuffling prima un lambda. Non è necessario qui (credo) e complica molto il codice.

+0

Ho provato a creare un'istanza lambda di mischiare, solo per verificare come funzionano i lambdas in kotlin. –

+0

@AntonShkurenko ha funzionato? – voddan

+0

1) Sono in grado di aggiungere linee multiple? L'ultima riga restituirà il valore? Ma cosa succede se uso se/else? 2) Se riesco a riscrivere l'interfaccia su quella di java, sarò in grado di usare lamdas? O come farlo con Kotlin? Mi piace molto non scrivere questo oggetto, eseguire l'override, ecc. –

Problemi correlati