我一直在阅读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,并且两者似乎都可以并行工作。
一个比另一个好吗?如果是,为什么?
答案 0 :(得分:6)
一个比另一个好吗?如果是,为什么?
使用第一种reduce
方法时,会有隐秘的拳击费用。
mapToInt.reduce(...)
方法可以避免这种情况。
所以,这个想法是,如果您对求和感兴趣,average等人会使用原始流特化,因为它们的效率更高。
顺便说一句,代码:
Arrays.stream(strarr).mapToInt(s -> s.length()).reduce(0, (s1, s2) -> s1 + s2)
可以简化为:
Arrays.stream(strarr).mapToInt(s -> s.length()).sum();
答案 1 :(得分:2)
三个参数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)