【发布时间】:2021-09-04 16:26:04
【问题描述】:
我有下面的代码设置,我有点困惑为什么当 Comparator 设置为按升序或降序排序时 stream.max() 返回不同的结果。我知道比较器如何对数组进行排序,但不太清楚 max 和比较器如何处理流。
public class Main
{
public static void main(String[] args) {
Cat c1 = new Cat(5);
Cat c2 = new Cat(6);
Cat c3 = new Cat(7);
ArrayList<Cat> arr = new ArrayList<Cat>();
arr.add(c1);
arr.add(c2);
arr.add(c3);
Optional<Cat> cMax = findMax(arr);
System.out.println(cMax.get().age);
}
public static Optional<Cat> findMax(ArrayList<Cat> arr) {
return arr.stream()
.max((Cat a, Cat b) -> {
return b.age - a.age;
// versus a.age - b.age
});
}
}
class Cat{
int age;
Cat(int age){
this.age = age;
}
}
【问题讨论】:
-
我没试过,但我的期望是
max(a-b)是min(b-a) -
对
b.age - a.age返回 5 和a.age - b.age返回 7 -
你可以把它想象成比较器回答了“a大于b吗?”这个问题。通过返回正数(是)或负数(否)。如果你系统地“撒谎”,寻找最大值实际上会找到最小值。
-
max 函数和比较器之间的操作顺序令人困惑。
max函数在这里跟踪流中比较的每对之间的最大值吗?
标签: java java-stream comparator