Stream.collect 方法中的组合器如何在 Java 8 中工作? [英] How does combiner in Stream.collect method work in java 8?

查看:25
本文介绍了Stream.collect 方法中的组合器如何在 Java 8 中工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了简单的演示:

public static void main(String[] args) {
        List<String> list2 = Arrays.asList("adf", "bcd", "abc", "hgr", "jyt", "edr", "biu");

String collect = list2.stream().collect(String::new, (res, elem) -> {
              res=res.concat(" ").concat(elem);
//            System.out.printf("res=%s, elem=%s
", res.isEmpty(), elem);

        }, (res1, res2) -> {
            System.out.printf("res1=%s, res2=%s
", res1, res2);            
        });
        System.out.println("collect=" + collect);
}

问题在于 collectBiConsumer combiner 部分根本没有运行.

The problem is that BiConsumer combiner part of collect doesn't run at all.

如果我使用 parallelStream() 它会运行但是两个参数 res1res2 等于供应商 String::new.

It runs if I use parallelStream() but two arguments res1 and res2 are equal to supplier String::new.

如何让combinercollect方法中工作?

推荐答案

首先,不需要在非并行流中执行组合器,因为没有任何东西可以组合.

First off, there is no need for the combiner to be executed in a non-parallel stream since there is nothing to combine.

其次,您的问题源于使用 String::newString.concat.累加器应该通过将第二个参数与其结合来修改第一个参数,但由于 Java 中的字符串是不可变的,因此您的代码将不会产生任何结果.

Secondly, your issue stems from using String::new and String.concat. The accumulator is supposed to modify the first argument by combining the second argument with it but since strings in Java are immutable your code will produce nothing.

          res=res.concat(" ").concat(elem);

将创建一个新字符串,然后将其丢弃.您想改用 StringBuilder 以便保留中间结果:

will create a new string and then throw away it. You want to use a StringBuilder instead so you can keep the intermediate results:

public static void main(String[] args) {
    List<String> list2 = Arrays.asList("adf", "bcd", "abc", "hgr", "jyt", "edr", "biu");

    String collect = list2.stream().collect(StringBuilder::new, (res, elem) -> {
        res.append(" ").append(elem);
    }, (res1, res2) -> {
        res1.append(res2.toString());
        System.out.printf("res1=%s, res2=%s
", res1, res2);
    }).toString();
    System.out.println("collect=" + collect);
}

这也适用于并行流

res1= hgr jyt, res2= jyt
res1= bcd abc, res2= abc
res1= adf bcd abc, res2= bcd abc
res1= edr biu, res2= biu
res1= hgr jyt edr biu, res2= edr biu
res1= adf bcd abc hgr jyt edr biu, res2= hgr jyt edr biu
collect= adf bcd abc hgr jyt edr biu

res1= hgr jyt, res2= jyt
res1= bcd abc, res2= abc
res1= adf bcd abc, res2= bcd abc
res1= edr biu, res2= biu
res1= hgr jyt edr biu, res2= edr biu
res1= adf bcd abc hgr jyt edr biu, res2= hgr jyt edr biu
collect= adf bcd abc hgr jyt edr biu

这篇关于Stream.collect 方法中的组合器如何在 Java 8 中工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆