Java 8流的max(Math :: max)

时间:2018-10-17 15:46:02

标签: java java-8 java-stream

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

代码如下:

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()时,它将返回最大值。为什么?

1 个答案:

答案 0 :(得分:7)

这有点微妙,让我们一次取两个:

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

这是阴性结果,因为max中的stream方法接受Comparator,它表示:

  如果第一个参数小于第二个参数,

返回一个负整数。

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

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

您可以从此处构建其他数字的逻辑,并了解为什么得到-16

要纠正此错误,您需要:

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