【发布时间】:2021-06-26 03:16:01
【问题描述】:
在 JavaScript 中,我们可以使用 reducer 构建具有其他类型的字符串(例如 num 到字符串):
const string = [1,2,3,4,5].reduce((acc,e) => acc += e, "") //"12345"
在 Java 中,从其他类型构建字符串时,这种模式并不容易:
ArrayList<Integer> arrayListOfIntegers = (ArrayList<Integer>) Arrays.asList(1,2,3,4);
String string = arrayListOfIntegers.stream().reduce("", (String acc, Integer e) -> acc += e); // acc += e throws error
错误是:
“错误的返回类型:字符串无法转换为整数”
这种模式在 Java 中是不可能的吗?
【问题讨论】:
-
Java 是一种强类型语言,您不能只是将整数混入字符串并期望编译器知道您的意思是连接还是加法。此外,如果您阅读
Stream.reduce的JavaDoc,您会发现所有涉及的参数都必须属于同一类型。所以你需要先将 Integer 映射到 String 才能将其缩减为字符串。 -
使用
+=是一种混淆。您的实际意图是(acc, e) -> acc + e,但您选择使用+=将导致对acc参数变量的无意义修改,该变量将永远不会被再次读取。除此之外,在 Java 中你需要reduce("", (acc,e) -> acc + e, (s1,s2) -> s1 + s2)。这可行,但对于具有大量元素的流来说效率非常低。如果您喜欢简单,请使用map(String::valueOf).collect(Collectors.joining()),或使用collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) .toString()以获得最高效率。
标签: javascript java java-stream reduce binary-operators