Java8-Flatmap⽤法了解现在要列出⼀个列表中不同的单词,列表数据如下
{"java", "python", "php"}
测试demo1
public static void main(String[] args){
List<String> words = wArrayList("java","python","php");
words.stream()
.map((word)-> word.split(""))
.distinct()
.map(Arrays::toString)
.List())
.forEach(System.out::println);
}
测试demo1的逻辑是先做拆分,然后再做去重,之后转字符串输出
运⾏结果如下:
和想象的完全不⼀样,这是因为以上的map返回的流实际上是Stream<String[]>类型的,如下:
Arrays.stream()的⽅法可以接受⼀个数组然后产⽣⼀个流
测试demo2java中split的用法
public static void main(String[] args){
List<String> words = wArrayList("java","python","php");
words.stream()
.map((word)-> word.split(""))
.map(Arrays::stream)
.distinct()
.List())
.forEach(System.out::println);
}
输出结果如下:
只有3个对象输出,还是与预期结果不符合,如下:
可以发现确实是从数组流转换成了字符类型的流,但是结果还是只有3个,和原来转换出来的数组数量⼀样,说明这步其实只是把每个数组都转成了流,然后再去重,结果⾃然还是3个,所以真正要做的是把每个数组中的每个字母都变成⼀个字符类型的流,然后再合并流做去重。
测试demo3
public static void main(String[] args){
List<String> words = wArrayList("java","python","php");
words.stream()
.map((word)-> word.split(""))
.flatMap(Arrays::stream)
.distinct()
.List())
.forEach(System.out::println);
}
这⾥使⽤了flatMap
输出结果:
发现使⽤了flatMap后,结果符合预期。
总结
可以把flatMap的作⽤想象成,把⼀个流中的每⼀个值都转换成另⼀个流,然后再把这些流合并起来做操作,有点总-分-总的样⼦。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。