首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Stream.max(整数::max):意外结果

Stream.max(整数::max):意外结果
EN

Stack Overflow用户
提问于 2016-03-20 20:03:55
回答 5查看 1.7K关注 0票数 8

我正在使用Enthuware的模拟测试为1z0-809 : Java 8程序员II学习。

遇到这个问题。

List ls = Arrays.asList(3,4,6,9,2,5,7);System.out.println(ls.stream().reduce(Integer.MIN_VALUE,(a,b)->a>b?a:b);//1 System.out.println(ls.stream().max(Integer::max).get());/2 System.out.println(ls.stream().max(Integer::compare).get());//3 System.out.println(ls.stream().max((a,b)->a>b?a:b));//4上述哪一条语句将打印9?

答案是

1和3

但还有别的东西。我不明白为什么

代码语言:javascript
复制
System.out.println(ls.stream().max(Integer::max).get()); // PRINTS 3

我试着用peek调试它,但它无助于我理解。

我试图使用lsInteger::compareInteger::max进行排序。

代码语言:javascript
复制
ls.sort(Integer::max);     // [3, 4, 6, 9, 2, 5, 7]
ls.sort(Integer::compare); // [2, 3, 4, 5, 6, 7, 9]

当然,我知道Integer::max不是一个比较器,因此它具有相同的签名。对于我来说,在第一个例子中,max应该是7,因为它是最后一个元素,就像我使用Integer::compare排序时一样。

有人能把它分解成简单的东西吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-20 20:15:28

Integer.max(a, b)将返回给定ab的更大值。如果您以某种方式使用该结果作为比较器,则返回的正值将被视为a > b,因此a将保持不变。

前两个元素是3和4,两者都是正的。Integer.max(3, 4) = 4 > 0。所以你实际上是说有这样一个比较器的3 > 4,所以3是保持不变的。然后,其他的情况也是如此:Integer.max(3, 6) = 6 > 0,SO3被认为是最大值,等等。

票数 11
EN

Stack Overflow用户

发布于 2019-11-16 17:33:45

你需要替换

代码语言:javascript
复制
.max(Integer::max)

使用

代码语言:javascript
复制
.max(Integer::compare)

这里的问题是,抽象方法compare被声明为返回一个int值,这也是Integer.max和方法Integer.compareInteger类中的签名所满足的,因此表示Integer::max被推断为一个有效的Comparator。虽然预期会实现这样的比较方法:

返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。

在当前的场景中,代码总是返回一个正值(给定输入),因此比较的第一个元素被认为是更大的,总是这样返回的。

票数 11
EN

Stack Overflow用户

发布于 2016-03-20 20:14:27

比较器方法(关于参数firstsecond)的合同是:

  • 如果first等于second,则返回0
  • 如果first < second返回负值
  • 如果first > second返回正值

只有正值的max方法将始终返回一个正值。当根据比较器契约解释返回值时,正值意味着first > second。因此,订购的项目不会改变,他们似乎是“订购”。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36118832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档