Comment appeler de Java Flux.collect() de groovy?
Avoir un arrière-plan avec FP Scala je n'aime pas vraiment Groovy de noms pour les méthodes de collecte. Étant donné que certains choix architecturaux ci-dessus, j'ai trouvé à l'aide de Java 8 API de flux (en plus de java.util.Facultatif) dans Groovy code une solution attrayante.
Jusqu'à ce que j'ai touché ce:
def finalCollection = [ 'some', 'items', 'really', 'not', 'important' ].stream()
.map { aMethodReturningOptional(it) } //map String to Optional<Item>
.flatMap { it.map(Stream.&of).orElseGet(Stream.&empty) } //convert to Stream<Item>
.collect() //Groovy's collect, not stream's!
Remarque, il ne fonctionne qu'en Groovy, 2+ - le traitement de fermeture lambda.
Ce qui me dérange, c'est la dernière ligne de l'exemple de code. Groovy se traduit par l'appel à la DefaultGroovyMethods.collect()
au lieu de Stream.collect()
que je voulais à l'origine de l'utiliser. Bien sûr, la dernière ligne serait:
.collect(Collectors.toList()) //Should call Java collect, but it doesn't
Il semble contre-intuitif pour moi, qu'une méthode d'extension est appelée à la place de natifs, intégré selon la méthode de la classe.
Comment puis-je réécrire l'exemple pour la Stream.collect()
méthode doit être appelée?
Mise à JOUR: Après plus de jouer du violon, j'ai découvert ce problème que j'ai eu à l'origine. J'ai écrit .collect{Collectors.toList()}
(note accolades), ce qui a évidemment appelé Groovy méthode, pas de Java. Note à moi-même: n'oubliez pas de quadruple-vérifier avant de poster...
collect(Collectors.toList())
, au lieu de collect()
? Je ne suis pas un super expert, mais puisque vous appelez à frais virés() sans argument, pourquoi groovy appel Stream.collect(), puisque cette méthode attend un Collectionneur comme argument?Je suis d'accord avec @JBNizet... Si vous appelez le groovy méthode, il va utiliser le groovy méthode. Essayez d'appeler le Java 8 méthode?
OK, après un peu plus de l'expérimentation que j'ai trouvé à ce problème que j'ai eu. Dans une expérience originale que j'ai écrit
collect{Collectors.toList()}
(note accolades) qui n'est évidemment pas ce qu'elle devrait être. Je suis bête.OriginalL'auteur Jerzyna | 2015-10-19
Vous devez vous connecter pour publier un commentaire.
À l'aide de
Collectionneurs.toList()
vous pouvez obtenir ce que vous voulez faire:De toute façon, avec groovy 2.4.5 ci-dessus fonctionne également avec
qui utilise groovy de collecte d':
OriginalL'auteur jalopaba