使用 (a,b) -> a-b lambda 函数 java

use of (a,b) -> a-b lambda function java

你好 我总是很困惑为什么我们使用 (a,b) -> a-b 进行排序。

例子-

Collections.sort(list, (a, b) -> { return (a[1] - b[1]); });

PriorityQueue MaxHeap = new PriorityQueue<>((a,b) -> a-b);

我真的很困惑,我试图通过调试代码来理解这个语句的流程。

ArrayList<int[]> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(new int[] { start[i], end[i] });
}
Collections.sort(list, (a, b) -> {
return (a[1] - b[1]);
});

int count = 1;
int[] x = list.get(0);
for (int i = 1; i < list.size(); i++) {
int[] res = list.get(i);
if (x[1] < res[0]) {
count += 1;
x = res;
}
}
return count;
}

如果有人有更好的理解方式请帮助我。

lambda (a,b) -> a-b 目标 是产生一个满足 Comparator 契约的数字:

  • 如果 a 小于 b - return 为负结果
  • 如果 a 等于 b - return 零
  • 如果 a 大于 b - return 为阳性结果。

Comparator 编辑的值 return 被 sort 用于比较集合中的元素对(数字)以决定哪个更大。

问题a - b 对于 Java 整数类型 1 不能正常工作。在某些情况下,a - b 会溢出,您会得到符号错误的结果。例如,如果 aInteger.MIN_VALUE,而 b 是一个正整数,那么 a - b 应该是负数时会是​​正数。

(这是一个相当常见的错误,即使是相对有经验的程序员也会犯...但希望只有一次。)

相比之下,Integer.compare(int, int) 方法为所有可能的参数给出了正确的答案。更好(即更正确)的解决方案是:

Collections.sort(list, (a, b) -> Integer.compare(a[1], b[1]));

PriorityQueue<Integer> MaxHeap = new PriorityQueue<>(Integer::compare);

1 - 事实上,对于溢出不会触发某种异常的任何类型的整数类型。对于浮点类型,有不同的问题。