当前位置: 首页 > 知识库问答 >
问题:

Java 8-reduce(0,integer::sum)与reduce(0,(a,b)->a+b)之间的差异

陈瀚
2023-03-14
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);

Integer sum1 = numbers.stream().reduce(0, (a, b) -> a+b);
System.out.println("SUM ="+sum1);

Integer product = numbers.stream().reduce(0, (a, b) -> a*b);
System.out.println("PRODUCT = "+product);

int sum2 = numbers.stream().reduce(0, Integer::sum);
System.out.println("SUM 2= "+sum2);

Optional<Integer> sum3 = numbers.stream().reduce((a, b) -> (a + b));
System.out.println("SUM3="+sum3);

// Updated as per  @Hadi J comment
int sum4 = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println("Sum ="+sum4);

共有1个答案

楚俊逸
2023-03-14

使用性能的最佳方法是什么,如果使用大整数值,为什么?

主要思想是在处理原语及其对象表示时忽略自动装箱/取消装箱。

添加两个integer对象比添加两个int基元复杂得多。你可以在这个帖子中找到更多的细节。

更糟糕的(但不是最糟糕的)情况是将对象integer与原语int求和。它将导致第一个参数的取消装箱。这就是当您的初始数组或集合包含对象(例如integer[]、List等)时的工作方式而累加器是原始的。这将使集合的每个元素完全取消装箱一次,而累加器将保持不变。

最坏的情况是将对象集合汇总为integer累加器。

>

  • 普通旧Java:

    Integer[] array = {0,1,2,3,4,5,6,7,8,9};
    Integer sum = 0;
    // Each element of the array will be unboxed exactly once
    // sum will be unboxed 10 times
    // result of the sum will be boxed 10 times
    for(int i : array) sum += i;
    
    Integer[] array = {0,1,2,3,4,5,6,7,8,9};
    int sum = 0;
    // Each element of the array will be unboxed exactly once
    // result of the sum will be boxed 10 times
    for(int i : array) sum += i;
    
    int[] array = {0,1,2,3,4,5,6,7,8,9};
    int sum = 0;
    // No boxing/unboxing at all
    for(int i : array) sum += i;
    

    流API

    >

  • 减少的和

    Stream<Integer> stream = Stream.of(0,1,2,3,4,5,6,7,8,9);
    // Each element will be unboxed exactly once
    // The accumulator will be unboxed 10 times
    // The result of the sum operation will be boxed 10 times
    Integer sum = stream.reduce(0, Integer::sum);
    

    减少映射到基元int的和

    Stream<Integer> stream = Stream.of(0,1,2,3,4,5,6,7,8,9);
    // Each element will be unboxed exactly once
    // Neither accumulator not result will be unboxed/boxed
    int sum = stream.mapToInt(Integer::intValue).reduce(0, Integer::sum);
    
    IntStream stream = IntStream.of(0,1,2,3,4,5,6,7,8,9);
    // No boxing/unboxing at all
    int sum = stream.reduce(0, Integer::sum);
    // same as
    int sum2 = stream.sum();
    

  •  类似资料:
    • 本文向大家介绍if(a-b <0)和if(a 相关面试题,主要包含被问及if(a-b <0)和if(a 时的应答技巧和注意事项,需要的朋友参考一下 并且可能意味着两个不同的东西。考虑以下代码: 运行时,将仅打印。发生的事情显然是错误的,但是溢出并变为,这是负面的。 话虽如此,请考虑一下数组的长度确实接近。中的代码如下所示: 确实接近,所以(是)可能溢出并变成(即负数)。然后,将 下溢 相减回正数。

    • 问题内容: 我正在学习Java,但有两个问题: 之间有什么区别? 和 考虑到: 之间有什么区别: (A)x.run_function(); 假设A和B都具有函数,将执行哪个函数? 问题答案: 最重要的区别在于对象的静态和动态类型与对象的引用之间。 说B延伸A,C延伸B。 对象的动态类型(新类型中使用的类型)是其实际的运行时类型:它定义了对象的实际方法。 对象引用(变量)的静态类型是编译时类型:它定

    • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

    • 问题内容: 为什么以下两个语句的结果不同? 编辑: 我应该补充一点,我怀疑将“ 0”第一条语句强制转换为要比较的布尔值-这应该与“‘0’== true”完全相同,显然这是不正确的。 问题答案: 首先,为了完整性: 是的,因为是一个非空字符串,这始终计算结果为: 字符串:如果参数为空字符串(其长度为零),则结果为 false; 否则为 false 。否则结果为 true 。 现在到。 这里将进行两次

    • 问题内容: 今天,我发现了python语言一个有趣的“功能”,这让我感到非常悲伤。 那个怎么样?我以为两者是等同的!更糟糕的是,这是我调试时遇到的麻烦的代码 WTF!我的代码中包含列表和字典,并且想知道我到底怎么把dict的键附加到列表上而又没有调用.keys()。事实证明,这就是方法。 我认为这两个陈述是等效的。即使忽略这一点,我也可以理解将字符串追加到列表的方式(因为字符串只是字符数组),但是

    • 问题内容: 我目前正在尝试了解在自定义类上使用和之间的区别。有许多网站说使用’+’运算符会导致使用特殊方法-到目前为止还不错。 但是,当我运行以下示例时,我得到两个不同的结果。 结果: 现在,据我了解,执行Python时检查/执行int方法-发现没有实现添加int和C对象的实现-返回NotImplemented- 这使Python知道检查对象C并执行其中的代码。 为什么执行代码会导致结果,但是其他