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

Stream.Collect方法中的组合器在Java8中是如何工作的?

欧阳成弘
2023-03-14
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);
}

如果我使用ParallelStream(),但RES1RES2两个参数等于supplierString::new,它就会运行。

如何使组合器collect方法中工作?

共有1个答案

陆俊捷
2023-03-14

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

其次,问题源于使用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);
}
 类似资料:
  • 问题内容: 我创建了一个简单的演示: 问题在于的一部分根本没有运行。 如果我只使用两个参数并且等于provider ,它将运行。 如何使方法工作? 问题答案: 首先,由于没有要合并的内容,因此不需要在非并行流中执行合并器。 其次,您的问题源于使用和。应该使用累加器通过将第二个参数与第一个参数结合来修改第一个参数,但是由于Java中的字符串是不可变的,因此您的代码不会产生任何结果。 将创建一个新字符

  • 我对方法引用在Java8中是如何工作的有些困惑。我编写了下面的代码段用于过滤文件夹中的隐藏文件。他们正在产生正确的结果。我不理解->listFiles方法的方法签名是如何在这个代码段的选项2中工作的。 这是我在Java8文档中发现的

  • 我正在为Java8证书做准备,下面的内容让我有点困惑,也许有人能帮我?在这个例子中,一个Squirrel类被建模。它有一个名称和一个权重。现在你可以创建一个比较器类来使用这两个字段对它进行排序。所以首先按名称排序,然后按权重排序。类似于这样: 到现在为止,一直都还不错。。但接下来是令人困惑的部分。在代码示例下面,它们声明您可以使用方法链接在一行中编写此代码。也许我误解了,但当我将比较部分和then

  • 我正在Scala 3中运行以下代码。x、 据我所知,它应该返回True,因为Int根据Scala文档扩展了AnyVal。 在Java中,下面的代码打印为true,这是可以理解的。

  • 如果我从集合界面有两个对象列表 列表1={约翰,蒂姆,汤姆} 列表2={约翰,蒂姆} 这两个列表都是ArrayList的实例 Java怎么知道list2是否包含在list1中,list1.containsall(list2)? 我知道Java使用包含方法内部实现的容器()方法,和包含方法使用相等()方法。我理解差异,但我不确定Java如何遍历列表1的元素。 如果我使用列表1。containsAll

  • 我遇到了Java8中引入的arrays.ParallelPrefix。 这个重载的方法以累加的方式对输入数组的每个元素执行操作。对于例如来自文档: 使用提供的函数,并行地将给定数组的每个元素累积到位。例如,如果数组最初保持[2,1,0,3]并且操作执行加法,则返回数组时保持[2,3,3,6]。对于大型数组,并行前缀计算通常比顺序循环更有效。 那么,当对一个术语的操作依赖于对前一个术语的操作结果时,