我需要对点列表进行排序。首先,我需要比较x值,然后如果x值相等,则y值。所以我以为我会使用thenComparing方法:
Comparator<Point> cmp = Comparator.comparingInt(p -> p.x).thenComparingInt(p -> p.y);
但我一直收到消息:不兼容的类型:比较器&lt;对象&gt;无法转换为比较器&lt; Point&gt;。
我还可以通过其他方式进行比较,但它有效,但我不明白我在这里做错了什么。
答案 0 :(得分:13)
此代码确实有效:
Comparator<Point> cmp = Comparator.<Point> comparingInt(p -> p.x)
.thenComparingInt(p -> p.y);
我只在<Point>
之前添加了comparingInt
,它明确声明了lambda中p
的类型。这是必要的,因为由于方法链,Java无法推断出类型。
另见Generic type inference not working with method chaining?
这是另一种选择:
Comparator<Point> cmp = Comparator.comparingDouble(Point::getX)
.thenComparingDouble(Point::getY);
这里,可以毫无问题地推断出类型。但是,您需要使用双重比较,因为getX
和getY
会返回双精度值。我个人更喜欢这种方法。
答案 1 :(得分:3)
尝试更改:
Comparator<Point> cmp = Comparator.comparingInt(p -> p.x).thenComparingInt(p -> p.y);
到
Comparator<Point> cmp = Comparator.comparingInt((Point p) -> p.x).thenComparingInt((Point p) -> p.y);