collect()
和forEach()
都是流终端操作,并且在同一流上同时调用它们会抛出IllegalStateException
。但是,以下代码成功编译并以升序打印每个String的长度。没有异常被抛出。怎么会这样?List<String> list = Arrays.asList("ant", "bird", "chimpanzee", "dolphin");
list.stream().collect(Collectors.groupingBy(String::length))
.forEach((a, b) -> System.out.println(a));
我被理解为collect()和forEach()都是流终端操作,并且在同一流上同时调用它们会抛出IllegalStateException。但是,以下...
list.stream()
生成的流被collect
操作消耗。但是,作为分组结果的操作会根据字符串的大小生成Map<Integer, List<String>>
。forEach
方法不是Stream::forEach
方法,而是Map::forEach
方法,就像您在Map::forEach
的返回值(即collect(...)
)上调用它一样。 Map
方法的一个特点是它需要一个Map::forEach
,而不是BiConsumer
。