【发布时间】:2024-01-07 02:31:01
【问题描述】:
我正在使用 Java 8。我知道它是 lambda、方法引用等新功能。但我对这段代码感到困惑:
static class SRoad implements Comparable<SRoad> {
int id;
public SRoad(int id) {
this.id = id;
}
@Override
public int compareTo(SRoad o) {
return this.id - o.id;
}
}
public static void main(String[] args) {
ArrayList<SRoad> c = new ArrayList<>();
// Assume I added some instances in to the list...
c.sort((SRoad::compareTo));
}
上面的代码基本上是根据 SRoad 的 id 对列表进行排序。请注意,在最后一行中,方法引用用一对额外的括号括起来。这不是一个错字,它必须像这样才能使 java 工作。我发现这行代码相当于:
c.sort(((o1, o2) -> o1.compareTo(o2)));
为什么它们是等价的?这是什么语法?
【问题讨论】:
-
这不是错字 - 你怎么知道?你试过其他方法吗?
-
多余的括号是多余的。
-
这是一个方法参考,不需要额外的括号
-
有人认为,括号提高了代码的清晰度。越多越好。与
c.sort(((((((SRoad::compareTo)))))));比较… -
但通常,要对实现
Comparable的元素列表进行排序,请使用c.sort(Comparator.naturalOrder());。你甚至可以使用c.sort(null);,但是编译器不会检查元素是否真正实现了可比性。更重要的是,您永远不应该使用减号来实现比较方法。两个int值之间的距离可能大于int值范围,导致溢出。请改用return Integer.compare(this.id, o.id);。
标签: java lambda syntax java-8 method-reference