java max(int integer)_Java 8 Lambdas max()使用Integer.max作为比较器

这篇博客讨论了在Java8中使用Stream的max()方法时,为何可以传递Integer::max作为参数,以及为何这可能导致不预期的结果。博主通过一个测试用例展示了在比较过程中,自定义的比较器总是返回第一个元素作为最大值,从而导致错误的结果。问题在于比较器应该根据比较条件返回负数、零或正数,而Integer::max始终返回较大的数。
摘要由CSDN通过智能技术生成

参见英文答案 > Java 8 stream’s .min() and .max(): why does this compile?                                    5个

我已经编写了带有示例值的简单列表,我希望流从Stream返回最大值.我知道max()函数需要Comparator,但事实证明,我也可以传递Integer :: max(任何人都可以解释我的,为什么?).

此外,程序打印出奇怪的结果,我在“内部”检查它看起来没问题,但在我得到最终结果后 – 它们不准确.

例:

@Test

public void testHowIntegerMaxWorksInStream() {

List list = Arrays.asList(5,3,8);

Optional op = list.stream().max((a, b) -> {

System.out.println("Input arguments a=" + a + ", b=" + b);

int max = Integer.max(a, b);

System.out.println("Returning max(a,b)=" + max);

return max;

});

System.out.println("Optional result=" + op.get());

}

输出:

Input arguments a=5, b=3

Returning max(a,b)=5

Input arguments a=5, b=8

Returning max(a,b)=8 // OK, Integer::max got 8.. but then ...

Optional result=5 // .. I got 5. WHY ???

我的问题:

>为什么我可以通过Integer :: max代替Comparator?

>为什么我的函数在8的内部返回5?

解决方法:

因为您创建Comparator始终返回第一个元素是最大的.

如果比较A和B,如果A较小,则应返回-1.返回A和B的Integer.max,在您的情况下,始终> 0.

(a,b) -> {

if (a>b) return 1; // 8 :)

if (a

if (a==b) return 0;

}

标签:java,lambda,java-8

来源: https://codeday.me/bug/20190715/1465764.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值