我正在寻找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变量!
提前致谢!
只需声明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。