2016-01-06 8 views

risposta

12

Per gli scenari non coperti dalle operazioni incorporate toList() ecc., È possibile utilizzare il fatto che raccogliere è solo una piega. Quindi, dato

val list: List<Pair<String, Int>> = listOf("Ann" to 19, "John" to 23) 

si può raccogliere una collezione di vostra scelta con una piega

val map: Map<String, Int> = list.fold(HashMap(), { accumulator, item -> 
    accumulator.put(item.first, item.second); accumulator}) 

Se poi si definisce una funzione di estensione

fun <T, R> Iterable<T>.collectTo(accumulator: R, accumulation: (R, T) -> Unit) = 
    this.fold(accumulator, { accumulator, item -> accumulation(accumulator, item); accumulator }) 

è possibile semplificare ulteriormente

val map2: Map<String, Int> = list.collectTo(HashMap(), { accumulator, item -> 
    accumulator.put(item.first, item.second) }) 

Althou In questo caso, ovviamente, potresti semplicemente utilizzare la funzione di estensione .toMap.

4

NOTA:Per alcuni casi comuni in cui si usa Stream.collect da Java 8, è possibile utilizzare le funzioni già esistenti in stdlib Kotlin. Per quelli che non riesci a trovare in Kotlin puoi esplorare la creazione di flussi personalizzati come descritto nella risposta da @duncan. Questa risposta è stata aggiunta per aiutare a capire cosa è capace all'interno di stdlib, così puoi decidere quando scrivere qualcosa di personalizzato. Risponde al titolo della domanda "Qual è l'equivalente Kotlin di Java Stream.collect?"

ci sono funzioni nel stdlib per media, il conteggio distinto, il filtraggio, la ricerca, il raggruppamento, unendosi, mappatura, min, max, partizionamento, affettare, smistamento, sommando, da/per gli array, da/per le liste , da/per mappe, unione, co-iterazione, tutti i paradigmi funzionali e altro ancora. Little 1-liners e non c'è bisogno di usare la sintassi più complicata di Java 8. Penso che l'unica cosa che manca alla classe Java 8 Collectors integrata sia la riepilogo.

Un altro SO Messaggio copre queste equivalenze in dettaglio è: What Java 8 Stream.collect equivalents are available in the standard Kotlin library?