我一直在阅读reduce,刚刚发现有一个3参数版本可以像这样执行map reduce:
String[] strarr = {"abc", "defg", "vwxyz"};
System.out.println(Arrays.stream(strarr).reduce(0, (l, s) -> l + s.length(), (s1, s2) -> s1 + s2));
然而,我看不出这比带有reduce的mapToInt有什么优势。
System.out.println(Arrays.stream(strarr).mapToInt(s -> s.length()).reduce(0, (s1, s2) -> s1 + s2));
两者都产生12的正确答案,而且两者似乎都很好地并行工作。
一种比另一种更好吗?如果是,为什么?
发布于 2018-10-19 22:19:24
有三个参数的Stream.reduce
更加灵活:
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
与只接受和返回int
值的双参数IntStream.reduce
相比:
int reduce(int identity, IntBinaryOperator op);
而三参数版本中的accumulator
可以接受两种不同类型的参数:
BiFunction<Integer, String, Integer> acc = (i, str) -> i + str.length();
这允许您省略额外的map
操作:
Arrays.stream(strs).reduce(0, (i, str) -> i + str.length(), Integer::sum)
https://stackoverflow.com/questions/52893900
复制相似问题