在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  網絡安全/ java8 Stream中的flatmap不能和reduce連用?

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

使用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規(guī)約最長的一個字符串

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

回答
編輯回答
舊言

主要是因為你的biglist是list?的 只能捕獲變量 不能調用方法

2018年9月12日 09:48
編輯回答
久舊酒

報錯的主要原因其實是因為flatMap方法里需要的參數,你可以看到其實是一個Function,

clipboard.png

Function返回的值是一個Stream,所以直接填一個s.stream()顯然是滿足這個參數要求的..但是s.stream之后再用了reduce,reduce返回的是一個Optional

clipboard.png

當然就不滿足要求了,所以編譯報錯

當然如果題主最終是把兩個stream合在一起,可以不要用Stream.of方法,可以考慮哈由于之前兩個stream里的類型一樣,可以直接用Stream.contact,就不用攤平了,直接就是平的

Stream.concat(fruitList.stream(), meatList.stream())
2017年1月30日 06:56