java8 Stream中的flatmap不能和reduce连用?

夏之岚
  • 42

使用Java8 的Stream流操作集合

 List<String> fruitList=Stream
                .of("apple","banana","coconut","Damson","Filbert","Lemon")
                .collect(Collectors.toList());

        List<String> meatList=Stream
                .of("beef","pork","chicken","lamp","oyster","salmon","tuna")
                .collect(Collectors.toList());


        List<List<?>> bigList=Stream.of(fruitList,meatList).collect(Collectors.toList());

我想 使用flatMap方法 摊平集合 然后在使用reduce规约最长的一个字符串

 bigList.stream().flatMap(x->x.stream()
                .reduce((String x,String y)->x.length()>y.length()?x:y)
                .ifPresent(System.out::println);

结果报错
图片描述

错误信息 如图

这个错误是什么 capture of ? 也没见哪篇Stream的文章里讲过

如果把代码改成

 bigList.stream().flatMap(x->x.stream())
                .map(x->x+"")
                .reduce((String x,String y)->x.length()>y.length()?x:y)
                .ifPresent(System.out::println);

这样就可以了

如果

bigList.stream().flatMap(x->x.stream()).forEach(System.out::println)

这行代码也可以正常运行,依次两个集合合并后的所有元素
这样看 bigList.stream().flatMap(x->x.stream())返回的的应该是
所有元素的集合啊

为什么不能后面直接使用reduce方法?

回复
阅读 2.7k
2 个回答
✓ 已被采纳

报错的主要原因其实是因为flatMap方法里需要的参数,你可以看到其实是一个Function

clipboard.png

Function返回的值是一个Stream,所以直接填一个s.stream()显然是满足这个参数要求的..但是s.stream之后再用了reducereduce返回的是一个Optional

clipboard.png

当然就不满足要求了,所以编译报错

当然如果题主最终是把两个stream合在一起,可以不要用Stream.of方法,可以考虑哈由于之前两个stream里的类型一样,可以直接用Stream.contact,就不用摊平了,直接就是平的

Stream.concat(fruitList.stream(), meatList.stream())

主要是因为你的biglist是list?的 只能捕获变量 不能调用方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏