我正在使用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
但还有别的东西。我不明白为什么
System.out.println(ls.stream().max(Integer::max).get()); // PRINTS 3我试着用peek调试它,但它无助于我理解。
我试图使用ls和Integer::compare对Integer::max进行排序。
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排序时一样。
有人能把它分解成简单的东西吗?
发布于 2016-03-20 20:15:28
Integer.max(a, b)将返回给定a和b的更大值。如果您以某种方式使用该结果作为比较器,则返回的正值将被视为a > b,因此a将保持不变。
前两个元素是3和4,两者都是正的。Integer.max(3, 4) = 4 > 0。所以你实际上是说有这样一个比较器的3 > 4,所以3是保持不变的。然后,其他的情况也是如此:Integer.max(3, 6) = 6 > 0,SO3被认为是最大值,等等。
发布于 2019-11-16 17:33:45
你需要替换
.max(Integer::max)使用
.max(Integer::compare)这里的问题是,抽象方法compare被声明为返回一个int值,这也是Integer.max和方法Integer.compare在Integer类中的签名所满足的,因此表示Integer::max被推断为一个有效的Comparator。虽然预期会实现这样的比较方法:
返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。
在当前的场景中,代码总是返回一个正值(给定输入),因此比较的第一个元素被认为是更大的,总是这样返回的。
发布于 2016-03-20 20:14:27
比较器方法(关于参数first,second)的合同是:
first等于second,则返回0first < second返回负值first > second返回正值只有正值的max方法将始终返回一个正值。当根据比较器契约解释返回值时,正值意味着first > second。因此,订购的项目不会改变,他们似乎是“订购”。
https://stackoverflow.com/questions/36118832
复制相似问题