Java mapToInt 与使用 map 的 Reduce

Java mapToInt vs Reduce with map

我一直在阅读 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 的正确答案,而且似乎都可以并行工作。

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

三参数Stream.reduce更灵活:

<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);

与仅接受 returns 和 returns 值的双参数 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)

Is one better than the other, and if so, why?

第一种 reduce 方法存在潜在的 boxing 成本。

mapToInt.reduce(...) 方法避免了这种情况。

所以,如果您对求和感兴趣,average 等人只需使用原始流专业化,因为它们效率更高。

对了,代码:

Arrays.stream(strarr).mapToInt(s -> s.length()).reduce(0, (s1, s2) -> s1 + s2)

可以简化为:

Arrays.stream(strarr).mapToInt(s -> s.length()).sum();