2 回答
TA贡献1850条经验 获得超11个赞
您调用的方法forEach
不是Stream::forEach
方法,而是Map::forEach
方法,因为您在 的返回值(collect(...)
即Map
. 该方法的一个特点Map::forEach
是它采用BiConsumer
, 而不是Consumer
。流forEach
永远不会接受带有两个参数的 lambda!
因此,您只调用一个终端操作,即collect
流上的操作。在那之后,您再也没有对流执行任何操作(您开始使用返回的Map
),这就是IllegalStateExcepton
抛出 no 的原因。
要实际在同一流上调用两个终端操作,您需要首先将流放入变量中:
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贡献1869条经验 获得超4个赞
生成的流list.stream()
由该操作消耗collect
。但作为分组结果的操作是Map<Integer, List<String>>
根据字符串的大小生成的。
thenforEach
调用Map
由 生成的this 条目,因此后者collect
不会抛出异常。IllegalStateException
添加回答
举报