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

这条河是怎么流的。reduce(二进制运算符累加器)已初始化?

景志
2023-03-14

下面的代码工作完美,无需初始化减少操作。

int sum=Stream.of(2,3).reduce((Integer a,Integer b)->a+b).get(); // sum = 5
int sum=Stream.of(2,3).reduce((Integer a,Integer b)->a*b).get(); // sum = 6

它怎么知道第一个累加器是一个,所以它应该初始化为一个新的和=0,第二个累加器是一个*,所以它应该初始化为一个新的和=1?

共有3个答案

于鸿博
2023-03-14

只要流有一个或多个元素,就不需要标识值。第一次减少返回23,相当于023。第二个返回2*3,相当于1*2*3

通骁
2023-03-14

这是它的API规范:

Optional<T> java.util.stream.Stream.reduce(BinaryOperator<T> accumulator)

返回:一个描述减少结果的可选选项

根据其javadoc,等效代码为:

boolean foundAny = false;
T result = null;
for (T element : this stream) {
    if (!foundAny) {
        foundAny = true;
        result = element;
    }
    else
        result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty();

三个案例:

  1. 流中没有元素:返回Optional.empty()
  2. 一个元素:只返回该元素而不应用累加器。
  3. 两个或多个元素:将累加器应用于所有元素并返回结果。

此方法的更多示例:

// Example 1: No element
Integer[] num = {};
Optional<Integer> result = Arrays.stream(num).reduce((Integer a, Integer b) -> a + b);
System.out.println("Result: " + result.isPresent()); // Result: false

result = Arrays.stream(num).reduce((Integer a, Integer b) -> a * b);
System.out.println("Result: " + result.isPresent()); // Result: false

// Example 2: one element   
int sum = Stream.of(2).reduce((Integer a, Integer b) -> a + b).get();
System.out.println("Sum: " + sum); // Sum: 2

int product = Stream.of(2).reduce((Integer a, Integer b) -> a * b).get();
System.out.println("Product: " + product); // Product: 2

// Example 3: two elements
sum = Stream.of(2, 3).reduce((Integer a, Integer b) -> a + b).get();
System.out.println("Sum: " + sum); // Sum: 5

product = Stream.of(2, 3).reduce((Integer a, Integer b) -> a * b).get();
System.out.println("Product: " + product); // Product: 6
辛龙野
2023-03-14

1-参数reduce不以标识值(0或1)开头。它只对流中的值起作用。如果你看一下javadoc,它甚至会显示等价的代码:

 boolean foundAny = false;
 T result = null;
 for (T element : this stream) {
     if (!foundAny) {
         foundAny = true;
         result = element;
     }
     else
         result = accumulator.apply(result, element);
 }
 return foundAny ? Optional.of(result) : Optional.empty();
 类似资料:
  • 为什么方法中的accumulator参数是而不是像combiner参数那样的。 为什么它的类型?为什么是?应该是?

  • 我有两个错误。当我使用 二进制运算符' 我需要帮助!

  • 我想制作一个简单的Java程序,但我得到了以下错误: 这是我的代码:

  • 概述 二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。 二进制否运算符(not):符号为~,表示对一个二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移运算符(left s

  • 我理解CGFloat和Int之间的区别,但奇怪的是,我能够在if循环中使用 其中,image是未包装的UIImage及其大小。宽度是CGFloat,而数字200是Int类型,这可以在Xcode上运行,没有编译器错误。 然而与: Xcode返回错误: 二进制运算符' 并且Xcode无法运行。我在CGFloat上查看了Apple文档及其'=='和' 我的问题是,为什么一个有效,而另一个是错误?

  • 挑战任务 初始文件index-start.html中提供了一个包含多个列表项的无序列表元素,每一个列表项均添加了data-time属性,该属性用分和秒表示了时间。要求将所有的时间累加在一起,并用时:分:秒来表示计算的结果。 实现效果 基本思路 1.取得所有li中data-time属性的值,将时间换算为秒并累加求得总时间(单位:秒); 2.手动计算将总时间转化为新的格式“XX小时XX分XX秒”; 3