Ce Que Java 8 Flux De Données.recueillir les équivalents sont disponibles dans la norme Kotlin bibliothèque?
Dans Java 8, il est Stream.collecter
qui permet à des agrégations sur les collections. Dans Kotlin, il n'en existe pas de la même manière, d'autres que peut-être qu'une collection de fonctions d'extension dans la stdlib. Mais il n'est pas clair ce que les équivalences pour les différents cas d'utilisation.
Par exemple, à la haut de la JavaDoc pour Collecteurs
sont des exemples écrits pour Java 8, et en cas de portage à Kolin, vous ne pouvez pas utiliser le Java 8 classes lorsque sur une autre version du JDK, de sorte que probablement ils doivent être rédigés de manière différente.
En termes de ressources en ligne montrant des exemples de Kotlin collections, ils sont généralement trivial et ne pas vraiment comparer pour le même cas d'utilisation. Ce sont de bons exemples qui correspondent vraiment à des cas tels que documentés pour Java 8 Stream.collect
? La liste il y a:
- Accumuler des noms dans une Liste
- Accumuler des noms dans un TreeSet
- De convertir des éléments de chaînes et de les enchaîner, séparés par des virgules
- Calculer la somme des salaires des employés
- Les employés du groupe par département
- Calculer la somme des salaires par département
- Partition étudiants dans la réussite et l'échec
Avec des détails dans la JavaDoc lien ci-dessus.
Remarque: cette question est volontairement écrit et répondu par l'auteur (Auto-Répond À Des Questions), de sorte que le idiomatiques les questions les plus fréquemment posées Kotlin thèmes sont présents dans la. Aussi, pour clarifier certains très vieux réponses écrites pour les alphas de Kotlin qui ne sont pas précises pour le courant de la journée Kotlin.
- Dans le cas où vous n'avez pas d'autre choix que d'utiliser
collect(Collectors.toList())
ou similaire, vous pourriez frapper cette question: stackoverflow.com/a/35722167/3679676 (le problème, avec les solutions de contournement)
Vous devez vous connecter pour publier un commentaire.
Il y a des fonctions dans le Kotlin stdlib pour la moyenne, nombre, distinctes,de filtrage, de trouver, de regroupement, de rejoindre, de la cartographie, min, max, le partitionnement, le tranchage, le tri, la sommation, à/à partir de tableaux, en vers/à partir de listes, à/à partir de cartes, de l'union, co-itération, tous les paradigmes fonctionnels, et plus encore. De sorte que vous pouvez les utiliser pour créer de petites 1-liners et il n'est pas nécessaire d'utiliser le plus compliqué de la syntaxe de Java 8.
je pense que la seule chose qui manque à partir de l'intégré dans Java 8Collectors
classe est la synthèse de la (mais dans une autre réponse à cette question est une solution simple).manque Une chose à la fois est le dosage par le comte, qui est vu dans un autre Débordement de Pile répondre et a une réponse simple ainsi. Un autre cas intéressant est celui aussi de Débordement de Pile: Idiomatiques façon à versé séquence en trois listes à l'aide de Kotlin. Et si vous voulez créer quelque chose commeStream.collect
pour un autre usage, voir Flux Personnalisé.recueillir dans KotlinMODIFIER 11.08.2017: Chunked/fenêtré les opérations de collecte ont été ajoutés dans kotlin 1.2 M2, voir https://blog.jetbrains.com/kotlin/2017/08/kotlin-1-2-m2-is-out/
Il est toujours bon d'explorer les Référence de l'API pour kotlin.collections dans son ensemble, avant de créer de nouvelles fonctions, qui existe peut-être déjà là.
Voici quelques conversions à partir de Java 8
Stream.collect
exemples à l'équivalent en Kotlin:Accumuler des noms dans une Liste
De convertir des éléments de chaînes et de les enchaîner, séparés par des virgules
Calculer la somme des salaires des employés
Les employés du groupe par département
Calculer la somme des salaires par département
Partition étudiants dans la réussite et l'échec
Noms des membres masculins
Groupe de noms de membres dans la liste par genre
De filtrer une liste à une autre liste
Trouver la plus courte chaîne à une liste
Comptage des éléments dans une liste après le filtre est appliqué
et ça continue... Dans tous les cas, aucun pli, de réduire, ou d'autres fonctionnalités a été nécessaire pour imiter
Stream.collect
. Si vous avez d'autres cas d'utilisation, ajoutez-les dans les commentaires et nous pouvons voir!Au sujet de la paresse
Si vous voulez paresseux processus d'une chaîne, vous pouvez convertir en un
Sequence
à l'aide deasSequence()
avant de la chaîne. À la fin de la chaîne de fonctions, vous finissent généralement avec unSequence
ainsi. Ensuite, vous pouvez utilisertoList()
,toSet()
,toMap()
ou une autre fonction de matérialiser leSequence
à la fin.Pourquoi il n'y a pas de Types?!?
Vous remarquerez la Kotlin exemples ne précise pas les types. C'est parce que Kotlin a plein inférence de type et est complètement sécurisée de type au moment de la compilation. Plus que Java, car il a aussi des types nullables et peut aider à prévenir la redoutable NPE. Donc, ce dans Kotlin:
est la même chose que:
Parce que Kotlin sait ce
people
est, et quepeople.age
estInt
donc l'expression de filtre permet uniquement de la comparaison à unInt
, et quepeople.name
est unString
donc lamap
étape produit unList<String>
(readonlyList
deString
).Maintenant, si
people
étaient peut-êtrenull
, comme dans unList<People>?
alors:Renvoie une
List<String>?
qui aurait besoin d'être nulle vérifié (ou utiliser l'un de l'autre Kotlin opérateurs pour nullable valeurs, voir ce Kotlin idiomatiques façon de traiter avec nullable valeurs et aussi Idiomatiques façon de gérer les valeurs null ou vide liste dans Kotlin)Voir aussi:
Pour plus d'exemples, voici tous les échantillons de Java 8 Flux De Tutoriel converti à Kotlin. Le titre de chaque exemple, est dérivée de la source de l'article:
Comment les flux de travail
Différents Types de cours d'eau #1
ou, créer une extension de la fonction sur une Chaîne de caractères appelée ifPresent:
Voir aussi:
apply()
functionVoir aussi: Fonctions D'Extension
Voir aussi:
?.
Coffre-fort Appel de l'opérateur, et en général la possibilité de valeur null: Dans Kotlin, qu'est-ce que le idiomatiques façon de traiter avec nullable valeurs, de référencement ou de les convertirDifférents Types de cours d'eau n ° 2
Différents Types de cours d'eau n ° 3
Différents Types de cours d'eau n ° 4
Différents Types de cours d'eau n ° 5
Différents Types de cours d'eau n ° 6
Différents Types de cours d'eau n ° 7
Pourquoi L'Ordre Des Questions
Cette section du Java 8 Flux Tutoriel est la même pour Kotlin et Java.
La Réutilisation De Flux
Dans Kotlin, cela dépend du type de collection qu'il peut être consommé plus d'une fois. Un
Sequence
génère un nouvel itérateur à chaque fois, et à moins qu'il affirme que "seulement une fois" il peut le réinitialiser le début à chaque fois qu'il est pris en compte. Par conséquent, tandis que le suivant échoue dans Java 8 flux, mais travaille en Kotlin:Et en Java pour obtenir le même comportement:
Donc dans Kotlin le fournisseur de données décide si il peut le réinitialiser en arrière et de fournir un nouvel itérateur ou pas. Mais si vous voulez délibérément contraindre un
Sequence
à une itération de temps, vous pouvez utiliserconstrainOnce()
fonction pourSequence
comme suit:Opérations Avancées
Recueillir exemple #5 (oui, j'ai sauté ceux qui sont déjà dans l'autre réponse)
Et comme une note de côté, dans Kotlin nous pouvons créer simple classes de données et instancier les données de test comme suit:
Recueillir exemple #6
Ok, un intérêt plus le cas ici pour Kotlin. D'abord les mauvaises réponses afin d'étudier les variations de la création d'un
Map
à partir d'une collection/séquence:Et maintenant pour la réponse correcte:
Nous avons juste besoin de rejoindre les valeurs correspondantes pour réduire les listes et de fournir un transformateur pour
jointToString
de passer dePerson
instance à laPerson.name
.Recueillir exemple #7
Ok, celui-ci peut facilement être fait sans une coutume
Collector
, donc, nous allons résoudre le Kotlin, alors, imaginer un nouvel exemple qui montre comment faire un processus similaire pourCollector.summarizingInt
qui n'existe pas nativement dans Kotlin.C'est pas ma faute, ils ont ramassé un exemple trivial!!! Ok, voici une nouvelle
summarizingInt
méthode pour Kotlin et un correspondant de l'échantillon:SummarizingInt Exemple
Mais il est préférable de créer une fonction d'extension, 2 fait correspondre les styles de Kotlin stdlib:
Maintenant, vous avez deux façons d'utiliser la nouvelle
summarizingInt
fonctions:Et l'ensemble de ceux-ci produisent les mêmes résultats. Nous pouvons également créer cette extension pour travailler sur
Sequence
et des types primitifs.Pour le plaisir, comparer le JDK Java code vs Kotlin code personnalisé nécessaires pour mettre en œuvre cette synthèse.
.map { it.substring(1).toInt() }
: comme vous le savez bien déduit le type est l'un de kotlin pouvoir.Il y a certains cas où il est difficile d'éviter d'appeler
collect(Collectors.toList())
ou similaire. Dans ces cas, vous pouvez changer plus rapidement à un Kotlin équivalent de l'aide de l'extension des fonctions telles que:Alors vous pouvez simplement
stream.toList()
oustream.asSequence()
à retourner dans le Kotlin API. Un cas commeFiles.list(path)
forces vous dans unStream
quand vous ne le voulez et ces extensions peuvent vous aider à déplacer de nouveau dans la norme des collections et de Kotlin API.Plus sur la paresse
Prenons l'exemple de solution pour "Calculer la somme des salaires par département" donnée par Jayson:
Afin de faire de ce paresseux (c'est à dire éviter de créer un intermédiaire de la carte dans le
groupBy
étape), il n'est pas possible d'utiliserasSequence()
. Au lieu de cela, nous devons utilisergroupingBy
etfold
opération:Pour certaines personnes, cela peut même être plus lisible, puisque vous n'êtes pas affaire avec la carte les entrées: le
it.value
partie de la solution a été déroutant pour moi aussi au premier.Puisque c'est un cas commun et nous préférerions ne pas écrire le
fold
à chaque fois, il peut être préférable de simplement fournir un génériquesumBy
fonctionGrouping
:de sorte qu'on peut écrire: