在jdk8中,Stream提供带有供应商
、累加器
和组合器
的收集
功能
<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);
我在注释中看到了将String Stream转换为String的示例,但我很困惑组合器在函数签名中的用途。我认为在累加器中,新元素已添加到结果大陆?
我尝试给组合器一个null值,但我得到了一个null指针异常。
Stream<String> stringStream = Stream.of("hello", "world", "morning");
String string = stringStream.collect(StringBuilder::new,
StringBuilder::append, StringBuilder::append).toString();
System.out.println(string);
合并器:合并器工作在并行处理中,将两个值与累加器兼容
collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)
供应商:它创建一个新的结果容器,该容器将由累加器和组合器填充,最后由收集()
方法返回。在并行处理中,供应商函数将被多次调用,每次都将返回新的值。
累加器:它将附加元素合并到结果中。
组合器:它组合了两个必须与累加器兼容的值。合并器在并行处理中工作。
List<String> list = Arrays.asList("Mukesh", "Vishal", "Amar");
String result = list.parallelStream().collect(StringBuilder::new,
(response, element) -> response.append(" ").append(element),
(response1, response2) -> response1.append(",").append(response2.toString()))
.toString();
System.out.println("Result: " + result);
输出:
Result: Mukesh, Vishal, Amar
如果我们使用<代码>列表。stream()则输出将不同,因为它不是并行处理,因此没有任何东西可以组合。
输出:
Result: Mukesh Vishal Amar
为什么并行流使用合并器类,而顺序流将使用累加器?为什么并行流不使用累加器? 以下是上述代码的输出: 那么,为什么顺序流使用累加器,并行流使用组合器?并行流不能使用累加器吗?
示例程序: 所以,为了简化这里的问题,没有最终的转换,所以得到的代码非常简单。
问题内容: 示例程序: 因此,为简化起见,没有最终转换,因此生成的代码非常简单。 现在,产生一个顺序流。我只是将结果装箱到s中,然后将其收集到中。很简单 而且,无论我运行此示例程序多少次,都不会成功,这意味着永远不会调用我的虚拟组合器。 我有点期望,但是后来我已经误解了流,以至于我不得不问这个问题… 可以将的组合时,流过被称为 保证 是连续的? 问题答案: 仔细阅读ReduceOps.java中的
有人能解释一下CSS中“~”符号的用法吗? 我举了一个例子 我在这里没有得到~符号的用法。请帮帮我。
我有一个名为的链接列表对象。我在那个对象中添加了一些数据。假设如下: 我的问题是:如果我已经插入了100个数据,当我使用方法时,该数据将首先被插入,但方法也应该具有相同的功能,这意味着如果我在任何地方使用方法,它也必须在最后插入数据,但是如果我在方法之后添加了更多的数据,而这些数据只在最后插入,那么用方法代替它有什么用呢?我们可以只使用add()方法对吗?
有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的