为什么我的 lambda 不适用于比较器?

Why my lambda is not applicable for comparator?

起初,我写了下面的代码,但是无法构建。 Arrays.sort(n, (o1 ,o2) -> o1 % 2 == 0 ? 1 : -1); enter image description here

然后,我写了另一个代码来测试它。 Arrays.sort(n,(o1, o2) -> o1 - o2); 但它在 vs 代码中有相同的错误消息。 然后,我在IDEA中尝试了这些代码,它在下图中有不同的错误信息enter image description here 它说运算符'-'不能应用于'T','T。 然后,我重写代码:Arrays.sort(n,(int o1, int o2) -> o1 - o2); enter image description here 我不知道为什么我的代码不起作用。我找到了我昨天写的代码: Arrays.sort(envelopes,(int []o1,int []o2) -> o1[0] == o2[0] ? o2[1] - o1[1] :o1[0] - o2[0]); 效果很好。

您遇到了 Java 类型系统的缺陷之一,它使本来可以很好地向后兼容的 lambda 变得笨拙 — int 是原始类型。

(还)没有针对基本类型的泛型,所以没有 Comparator<int>。您尝试使用的排序方法的签名是

public static <T> void sort(T[] a, Comparator<? super T> c)

T不能是int(或shortbyte等)。

解决此问题的一种方法是将您的 int 框起来,例如有一个流:

Arrays.stream(n).boxed().sorted((i1, i2) -> i1 % 2 == 0 ? 1 : -1)

方法签名 sort 具有泛型类型 T:

public static <T> void sort(T[] a, Comparator<? super T> c);

因此,为了获得您想要的行为,您必须将 n 定义为 Integer.

的数组

这可以正常工作:

Integer[] n = new Integer[] {1, 2, 3, 4};
Arrays.sort(n, (o1 ,o2) -> o1 % 2 == 0 ? 1 : -1);

关于泛型和原始类型的 Whosebug 问题: Why don't Java Generics support primitive types?