当前位置: 首页 > 知识库问答 >
问题:

组合器在流的收集功能中有什么用途?[副本]

朱丰
2023-03-14

在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);

共有1个答案

姬寂离
2023-03-14

合并器:合并器工作在并行处理中,将两个值与累加器兼容

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()方法对吗?

  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的