具有昂贵的自定义键功能的最大列表

Bjö*_*ist 6 java collections max comparator java-8

在Java中查找您编写的序列的最大元素:

GameState bestGs = Collections.max(ns,
        Comparator.comparing(e -> minimax(e)));
Run Code Online (Sandbox Code Playgroud)

minimax是一个返回数字的函数,ns是一个集合.代码可以工作,但是对于集合的每个元素,将对键函数进行多次评估.我如何制作它,以便每个元素只评估一次?在Python中,您只需编写max(seq, key = lambda e: minimax(e))Java中必须有类似的内容吗?不要告诉我自己写forloop,这是21世纪我不应该的!

显式循环代码如下所示:

GameState best = null;
// Doesn't matter what scalar type is used.
int bestScore = Integer.MIN_VALUE;  
for (GameState n : ns) {
    int thisScore = minimax(n);
    if (thisScore > bestScore) {
        bestScore = thisScore;
        best = n;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在Java中以"功能"的方式编写上述内容,但也保留了高性能.

ole*_*nik 0

GameState max = ns.stream()
                 .collect(Collectors.toMap(str -> minimax(str), Function.identity(), (gs1, gs2) -> gs1,
                         (Supplier<Map<Integer, GameState>>)() -> new TreeMap<>(Comparator.reverseOrder())
                 )).values().iterator().next();
Run Code Online (Sandbox Code Playgroud)