下面的代码工作完美,无需初始化减少
操作。
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?
只要流有一个或多个元素,就不需要标识值。第一次减少返回23
,相当于023
。第二个返回2*3
,相当于1*2*3
。
这是它的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();
三个案例:
此方法的更多示例:
// 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
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