Reduce Integer.min不返回最低元素

时间:2017-10-26 19:00:51

标签: java java-8

我正在研究stream reduce并尝试运行非常简单的程序。

为什么Integer.min没有返回最小数量,例如Integer.min会返回最大数量?

public class Reducing {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(3,4,5,1,2);
        Integer sum = numbers.stream().reduce(0, (a, b) -> a+ b);
        System.out.println("REDUCE : "+sum);

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

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

        int min = numbers.stream().reduce(0, (a, b) -> Integer.min(a, b));
        System.out.println("MIN == > "+min);
    }
}

输出==&gt;

REDUCE : 15
15
MAX == > 5
MIN == > 0

6 个答案:

答案 0 :(得分:14)

您将0作为身份项提供给min。该值也将用于计算。

int min = numbers.stream().reduce(0, (a, b) -> Integer.min(a, b));

所以实际上就像拥有

一样
Arrays.asList(0,3,4,5,1,2)

你不要在示例中省略identity元素

int min = numbers.stream().reduce((a, b) -> Integer.min(a, b)).get();

答案 1 :(得分:5)

您将0作为初始值传递到reduce:reduce(0, (a, b) -> Integer.min(a, b))。因此它是最小的数字。改为通过Integer.MAX_VALUE或使用以下内容:

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

或者,甚至没有lambda:

Optional<Integer> min = numbers.stream().reduce(Integer::min)

还可以选择使用min代替:

Optional<Integer> min = numbers.stream().min(Comparator.naturalOrder());

答案 2 :(得分:3)

reduce操作的工作原理如下: 你有这个清单:

Arrays.asList(3,4,5,1,2); 

并做

reduce(0, (a, b) -> Integer.max(a, b));

表示:

比较所有对a,b和第一个元素必须为0作为前导

所以操作将是

Integer.max(a, b)
Integer.max(0, 3) => return  3
Integer.max(3, 4) => return  4
Integer.max(4, 5) => return  5
Integer.max(5, 1) => return  5
Integer.max(5, 2) => return  5

并且对于分钟,同样的类比适用......

Integer.min(a, b)

Integer.min(0, 3) => return  0
Integer.min(0, 4) => return  0
Integer.min(0, 5) => return  0
Integer.min(0, 1) => return  0
Integer.min(0, 2) => return  0

因此结果max:5和min:0

答案 3 :(得分:0)

此示例中的reduce操作有两个参数:

identity:如果流中没有元素,则identity元素既是缩小的初始值又是默认结果。在此示例中,identity元素为0;如果集合名单中没有成员,则这是年龄总和的初始值和默认值。

使用numbers.get(0)代替0,因此初始值将是列表中的第一项

答案 4 :(得分:0)

我想我需要在下面使用。可选是一个容器对象,用于包含非null对象。可选对象用于表示缺少值的null。 ...它是在Java 8中引入的,类似于Guava中的Optional。

Optional<Integer> min = numbers.stream().reduce(Integer::min);
min.ifPresent(System.out::println);

这是oracle文章:http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

答案 5 :(得分:0)

reduce方法在应用给定的identity函数时考虑reduction - 第一个参数,在您的情况下为0。提供的标识同时充当初始值和默认值。

根据Java docsreduce适用于以下算法:

T result = identity;
 for (T element : this stream)
     result = accumulator.apply(result, element)
 return result;

因此,在评估Integer.min时,0的值也包含在计算中。

解决方案是不提供任何大于或等于列表中最小值的身份或身份。