首页 > 解决方案 > Java 8 流的最大值(Math::max)

问题描述

当我进行测试时,我遇到了流的问题。

代码如下:

public class HelloWorld {
    public static void main(String []args) {

    List<Integer> integers = Arrays.asList(-2, -5, -7, -16);
    Integer integer = integers.stream().max(Math::max).orElse(0);
    System.out.println(integer);

    }
} 

返回值为 -15,即列表中的最小数字。但是当我将 max() 更改为 min() 时,它会返回最大值。为什么?

标签: javajava-8java-stream

解决方案


这在某种程度上非常微妙,让我们一次取两个:

 -2, -5 => Max between these two is "-2"

这是一个否定的结果,因为max来自 a 的方法stream接受 a Comparator,它说:

如果第一个参数小于第二个参数,则返回一个负整数。

因此,根据您的说法Comparator,您刚刚说过-5>-2或更简单的话:

Stream.of(-2, -5)
            .max(Math::max)
            .ifPresent(System.out::println); // will show -5

您可以从这里为其他数字构建逻辑,并了解-16您得到结果的原因。

要做到这一点,您需要:

 ...max(Comparator.naturalOrder())
   ....

推荐阅读