Java mapToInt与带有地图的Reduce

时间:2018-10-19 13:59:26

标签: java java-8 mapreduce reduce

我一直在阅读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,并且两者似乎都可以并行工作。

一个比另一个好吗?如果是,为什么?

2 个答案:

答案 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)