【问题标题】:Java mapToInt vs Reduce with mapJava mapToInt vs Reduce with map
【发布时间】:2019-03-24 10:28:18
【问题描述】:

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

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

【问题讨论】:

  • 您实际上是在问IntStreamStream<Integer> 之间的区别。检查这个:stackoverflow.com/questions/35209191/…。请记住,IntStream 为您提供了已经实现的“减少”:.sum()

标签: java java-8 mapreduce reduce


【解决方案1】:

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

使用第一个 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();

【讨论】:

    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2017-08-23
      • 2014-10-31
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多