鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ 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ī)約最長(zhǎng)的一個(gè)字符串

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

結(jié)果報(bào)錯(cuò)
圖片描述

錯(cuò)誤信息 如圖

這個(gè)錯(cuò)誤是什么 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)

這行代碼也可以正常運(yùn)行,依次兩個(gè)集合合并后的所有元素
這樣看 bigList.stream().flatMap(x->x.stream())返回的的應(yīng)該是
所有元素的集合啊

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

回答
編輯回答
舊言

主要是因?yàn)槟愕腷iglist是list?的 只能捕獲變量 不能調(diào)用方法

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

報(bào)錯(cuò)的主要原因其實(shí)是因?yàn)?code>flatMap方法里需要的參數(shù),你可以看到其實(shí)是一個(gè)Function

clipboard.png

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

clipboard.png

當(dāng)然就不滿足要求了,所以編譯報(bào)錯(cuò)

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

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