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();
我一直在阅读 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();