如何使用Java流获取具有相同最大值的所有对象?

Yot*_*tus 6 java lambda java-stream

我有玩家有积分.我想让所有使用流和过滤器分享最大分数的玩家.

public class Player {
    private int points; // Getter omitted
}
Run Code Online (Sandbox Code Playgroud)

我可以通过首先获得积分最多的玩家,并过滤所有具有相同金额的玩家来做到这一点.

Player topPlayer = players.stream().max(Comparator.comparing(Player::getPoints)).orElse(null);

players.stream().filter(p -> p.getPoints() == topPlayer.getPoints()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这可以通过单个谓词/单行完成吗?

Eug*_*ene 8

您可以收集到TreeMap第一个并且只获取最后一个条目(最大值为)

players.stream()
       .collect(Collectors.groupingBy(
           Player::getPoints,
           TreeMap::new,
           Collectors.toList()
       ))
       .lastEntry()
       .getValue();
Run Code Online (Sandbox Code Playgroud)

  • 尽管OP的原始解决方案在复杂性方面更有效(O(n)与O(nlogn)). (2认同)
  • @Yotus我的坏,它实际上是`lastEntry` (2认同)

Ton*_*hen 5

首先按点分组并得到一个Map结果,然后在map中找到max key.时间成本为O(n):

List<Player> players = new ArrayList<>();
players.stream().collect(Collectors.groupingBy(Player::getPoints))
        .entrySet().stream()
        .max(Map.Entry.comparingByKey())
        .ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)