参见英文答案 > 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