Java - Collection.max的比较器的内联定义

Nul*_*oet 7 java

我正在寻找python代码段的Java等价物

max_valued_key = max(str_to_double_map.keys(), key=lambda x: str_to_double_map[x])
Run Code Online (Sandbox Code Playgroud)

我想要像Collections.max这样的标准.
有没有办法用Comparator的内联定义来做这个,因为我不想为每个其他比较器再写一个类.

我尝试使用代码失败

depScores = foo();
String dep = Collections.max(depScores.keySet(), new Comparator<String>() {
  @Override
  public int compare(String o1, String o2) {
    return depScores.get(o1).compareTo(depScores.get(o2));
  }
});
Run Code Online (Sandbox Code Playgroud)

depScores变量不能从比较器中读取.
看起来在java内部类中无法从外部访问非final变量!

提前致谢!

Mik*_*bel 4

只需声明depScores为最终变量即可。如果由于某种原因不能,请创建指向它的第二个(最终)变量。

仅当局部类是最终变量时才可以捕获变量。


Comparator作为(非常)晚期的附录,在 Java 8 中从 lambda创建自定义是微不足道的:

String dep = Collections.max(
    depScores.keySet(),
    Comparator.comparing(k -> depScores.get(k))
);
Run Code Online (Sandbox Code Playgroud)

通过将 lambda 替换k -> depScores.get(k)为方法引用,您可以变得更加简洁depScores::get

捕获局部变量的规则depScore对于 lambda 来说比内部类更灵活一些:捕获的变量只需要有效的 final。换句话说,尽管不需要显式标记它们,但它们必须只分配一次final