如何使用lambda表示法创建具有初始容量和自定义比较器的优先级队列?

Jer*_*oen 1 java

我正在使用Java 10,我正在尝试创建一个简单的优先级队列.初始容量应为8(为了参数),优先级应该是数组中的值prior.我试着用

private double[] prior;
private PriorityQueue<Integer> queue;
queue = new PriorityQueue<Integer>(8, (int v, int w) -> Double.compare(prior[v], prior[w]));
Run Code Online (Sandbox Code Playgroud)

在我的代码中,但这不起作用.我总是得到错误" 构造函数PriorityQueue((int v,int w) - > {})未定义 ".我究竟做错了什么?这个问题似乎与lambda表达式有关,因为删除它会使错误消失.

Xir*_*ema 8

问题是,int并且Integer不完全相同.一个是原始数据类型,另一个是围绕该原始数据类型的Object包装器,而Java 5引入了Autoboxing/Autounboxing来制作代码,这两个代码之间的交互不那么痛苦,它们仍然是不正确的,就像它们一样对待它们相同.在这种情况下,lambda表达式试图匹配a的定义Comparator<int>(不能存在),并且队列期望a Comparator<Integer>,这是有效且合法的.

最简单的解决方案是让lambda表达式推导出参数类型:

PriorityQueue<Integer> queue = new PriorityQueue<>(8, (v, w) -> Double.compare(prior[v], prior[w]));
Run Code Online (Sandbox Code Playgroud)

这应该编译完全正确,并做你期望的.