Se voglio raccogliere la mia collezione Kotlin in qualcosa che non è incorporato nello stdlib, come faccio?Qual è l'equivalente Kotlin di Java Stream.collect?
risposta
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
.
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?
- 1. Qual è la politica di compatibilità di Kotlin?
- 2. Come posso eseguire file Kotlin-Script (.kts) da Kotlin/Java?
- 3. Qual è lo scopo della parola chiave `external` in Kotlin?
- 4. Java ArrayList to Kotlin Array
- 5. Perché "Stream.collect" è sicuro per tipo e "Stream.toArray (IntFunction <A[]>)" non lo è?
- 6. Ambito esterno di Kotlin
- 7. Qual è l'equivalente di java di ManualResetEvent?
- 8. Usa l'estensione Kotlin nella classe java android
- 9. chiamata java varargs metodo dal Kotlin
- 10. Confronto di NaN in Kotlin
- 11. Kotlin runtime jar vs kotlin stdlib jar
- 12. Come accedere all'oggetto compagno Kotlin in Java?
- 13. Accesso all'oggetto classe Kotlin da Java
- 14. Uso delle costanti kotlin nell'espressione java switch
- 15. Java 8 lambda per Kotlin lambda
- 16. Classe dati Kotlin che implementa l'interfaccia Java
- 17. dati statici in Kotlin
- 18. Utilizzo del tipo Java Void in Kotlin
- 19. varargs Kotlin Java interoperabilità non funziona correttamente
- 20. Qual è l'operatore & = per Java
- 21. Qual è l'equivalente C# di Java DecimalFormat?
- 22. Qual è l'equivalente Java di questo preg_replace?
- 23. Java 8: Qual è l'equivalente di "UseSplitVerifier"?
- 24. Qual è l'equivalente Smalltalk di Java statico?
- 25. Qual è il console.log() di java?
- 26. Qual è l'uso di hashcode in Java?
- 27. Campi statici di interfaccia Java di riferimento in Kotlin
- 28. Cos'è l'operatore Kotlin double-bang (!!)?
- 29. Kotlin. domanda di base JavaFX
- 30. Uso di Kotlin con Dagger
correlati: http://stackoverflow.com/questions/34642254 –