2 回答

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
您調(diào)用的方法forEach
不是Stream::forEach
方法,而是Map::forEach
方法,因?yàn)槟?的返回值(collect(...)
即Map
.?該方法的一個(gè)特點(diǎn)Map::forEach
是它采用BiConsumer
, 而不是Consumer
。流forEach
永遠(yuǎn)不會(huì)接受帶有兩個(gè)參數(shù)的 lambda!
因此,您只調(diào)用一個(gè)終端操作,即collect
流上的操作。在那之后,您再也沒有對流執(zhí)行任何操作(您開始使用返回的Map
),這就是IllegalStateExcepton
拋出 no 的原因。
要實(shí)際在同一流上調(diào)用兩個(gè)終端操作,您需要首先將流放入變量中:
List<String> list = Arrays.asList("ant", "bird", "chimpanzee", "dolphin");
Stream<String> stream = list.stream(); // you need this extra variable.
stream.collect(Collectors.groupingBy(String::length));
stream.forEach((a) -> System.out.println(a)); // this will throw an exception, as expected

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
生成的流list.stream()
由該操作消耗collect
。但作為分組結(jié)果的操作是Map<Integer, List<String>>
根據(jù)字符串的大小生成的。
thenforEach
調(diào)用Map
由 生成的this 條目,因此后者collect
不會(huì)拋出異常。IllegalStateException
添加回答
舉報(bào)