Quelle est la différence entre la carte et flatMap méthodes en Java 8?

Dans Java 8, quelle est la différence entre Stream.map et Stream.flatMap méthodes?

  • La signature d'un type un peu raconte toute l'histoire. map :: Stream T -> (T -> R) -> Stream R, flatMap :: Stream T -> (T -> Stream R) -> Stream R.
  • fwiw, ces signatures ne regarde même pas comme Java. (Je sais, je sais-mais-à-dire qu'il raconte "l'histoire" wrt carte/flatMap suppose beaucoup de connaissances au sujet de la nouvelle & l'amélioration de la "Java++")
  • Ce type de signature ressemble à Haskell, pas de Java. Mais il n'est pas clair si la Java signature est plus lisible: <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper).
  • Ha, ouais, je faisais allusion à la "effective Java". Comme C++, moderne, Java est presque méconnaissable à quelqu'un qui a commencé à l'utiliser dans les années 90 (comme je l'ai fait, dans les deux langues). Juste en réponse à cette observation, que les signatures de méthode à peine dire "toute une histoire", au moins pas plus, pas sans complément d'exposition (ou en ce que les commentateurs cas, la traduction).
  • Qui est-à-dire, un map's mappeur lambda retourne R, un flatMap's mappeur lambda renvoie une Stream de R (Stream<R>). Le flux renvoyé par la flatMaps'mapper sont effectivement concaténées. Sinon, les deux map et flatMap retour Stream<R>; la différence est que le mappeur lambdas retour, R vs Stream<R>.
  • Utilisation map si chaque élément est transformé en une valeur unique. Utilisation flatMap si chaque élément sera transformé à plusieurs valeurs et le flux résultant doit être aplatie.

InformationsquelleAutor cassiomolin | 2014-10-31