java - Stream.collect 方法中的组合器如何在 java 8 中工作?

标签 java java-8 java-stream

我创建了简单的演示:

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\n", res.isEmpty(), elem);

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

问题是 collectBiConsumer combiner 部分根本没有运行。

如果我使用 parallelStream() 但两个参数 res1res2 等于供应商 String::new

如何让combinercollect方法中工作?

最佳答案

首先,没有必要在非并行流中执行组合器,因为没有要组合的东西。

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

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

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

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\n", 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

关于java - Stream.collect 方法中的组合器如何在 java 8 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959795/

相关文章:

java - 在几个项目之间共享 JPA persistence.xml

具有可变参数的 Java 方法,可执行操作并打印已知结果

java - 注册一个 Stream "completion"钩子(Hook)

java - 使用 Java 8 更好地替换嵌套 for 循环中的代码

java - Oracle 和 SQL Server 上的 hibernate

Java Web 应用程序连接到 MYSQL 和 SQL SERVER

java - 如何用动态变化的简单数组创建多维数组?

java - 检查每个列表项的语句

macos - 无法解析类型 java.util.Map$Entry。 Mac OS 与 Debian 问题?

Java 8 Stream.findAny() 与在流中查找随机元素