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

发布于 2022-09-07 16:40:49 字数 1391 浏览 24 评论 0

使用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方法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空名 2022-09-14 16:40:49

报错的主要原因其实是因为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())
百善笑为先 2022-09-14 16:40:49

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文