【发布时间】:2021-08-29 21:57:14
【问题描述】:
下面三行全部编译,有什么不同吗?如果不是,那么始终坚持第一个,因为它的代码量最少,这是一种好的 Java 做法吗?
Map<String, String> m = new HashMap();
Map<String, String> k = new HashMap<>();
Map<String, String> l = new HashMap<String, String>();
当我提供比较器 lambda 时,我不明白为什么没有 的 PriorityQueue 无法编译:
PriorityQueue<Integer> pq = new PriorityQueue(); // compiled
PriorityQueue<Integer> pq = new PriorityQueue((x, y) -> (y - x)); // failed to compile
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> (y - x)); // compiled
【问题讨论】:
-
PriorityQueue似乎没有构造函数只接受Comparator。它确实有一个接受initialCapacity和一个Comparatordocs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html 的 ctor -
@MattU it does 从 java 8 开始。
-
那么,OP 使用的是 8 吗? :D 好电话。我什至没有注意我正在查看的文档版本(不是 Java 开发人员)。
-
@MattU 我知道你在开玩笑,但他们使用的是 lambdas,所以是的,他们肯定至少使用了 java 8 :)
-
不要使用减号作为比较器。减号可以溢出。由于
Integer具有自然顺序,您可以简单地将Comparator.reverseOrder()传递给构造函数。或(x, y) -> y.compare(x)
标签: java lambda comparator