gpt4 book ai didi

java - 在 Stream 的 collect() 终端操作中,如果 supplier 是一个像 String 这样的不可变对象(immutable对象)会怎样?

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:29 25 4
gpt4 key购买 nike

collect() Stream 的方法是一个可变的归约。基于 Java 文档:

A mutable reduction operation accumulates input elements into a mutable result container, such as a Collection or StringBuilder, as it processes the elements in the stream.

我尝试了以下方法,它编译没有问题。

Stream<String> stream1 = Stream.of("w", "o", "l", "f");
String word = stream1.collect(String::new, String::concat, String::concat);
System.out.println(word);

如果供应商是一个 StringBuffer,我将收集操作视为元素将附加到提供的 StringBuffer。

由于 String 是一个不可变对象(immutable对象),这里的可变缩减是如何工作的?会不会和reduce操作一样,每次实现累加器都会创建一个新对象?

最佳答案

How does mutable reduction works here since String is an immutable object?

事实并非如此。当您运行它时,您将得到一个空字符串(Supplier only 的结果)。编译器无法强制检查 Supplier 是否返回不可变对象(immutable对象),这绝对是它做不到的事情。由于您的容器是不可变的,因此对它的更新将被忽略。这就像做:

String s = "abc";
s.concat("def"); // the result is ignored here

如果您将其写成 lambda 表达式,可能会更有意义:

Stream<String> stream1 = Stream.of("w", "o", "l", "f");
String word = stream1.collect(
String::new,
(left, right) -> {
left.concat(right); // result is ignored
},
String::concat);

另一方面,当您使用 reduce 时,您被迫返回一些东西:

String word = stream1.reduce(
"",
(x, y) -> {
return x.concat(y);
},
(x, y) -> {
return x.concat(y);
});

当然,你仍然可以这样做:

String word = stream1.reduce(
"",
(x, y) -> {
x.concat(y);
return x; // kind of stupid, but you could
},
(x, y) -> {
return x.concat(y);
});

如果你想打破它;但这不是重点。

关于java - 在 Stream 的 collect() 终端操作中,如果 supplier 是一个像 String 这样的不可变对象(immutable对象)会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52296130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com