【发布时间】:2016-07-03 19:17:33
【问题描述】:
我用示例值编写了简单的List,我希望流从流返回最大值。我知道max() 函数需要Comparator,但事实证明,我也可以通过Integer::max(任何人都可以解释我的,为什么?)。
此外,程序打印出奇怪的结果,我在“内部”检查了它,它看起来不错,但在我得到最终结果后 - 它们并不准确。
例子:
@Test
public void testHowIntegerMaxWorksInStream() {
List<Integer> list = Arrays.asList(5,3,8);
Optional<Integer> 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? - 为什么我的函数返回 5 而内部是 8?
【问题讨论】:
-
你应该使用
Integer::conmpareTo,而不是Integer::max... -
您也可以使用
reduce(Integer::max);,因为取最大值是一个关联操作,但这与max(Integer::compare)几乎相同 -
1) 的答案:这就是方法引用的工作方式。如果方法的签名合适,就可以;没有“智能检查”可以防止这种情况发生。 2) 的答案:如果你告诉
max方法5>3>8和5>8这就是你得到的......