获得评级最低的对象的最佳方法

Best way to get an object with a lowest rating

我有一个对象列表,想要获得得分最低的人对象。 我对流媒体主题比较陌生,正在考虑什么是处理它的最佳方式。

public class Person {
  private String id;
  private List<Rating> ratingList;
}

public class Rating {
  private String rating;
  private LocalDate ratingDate;
}

我有一项服务可以从数据库中获取带有评级的 Person 对象列表。 首先,我将列表分组以列出具有评级的人员 Map<String, List<Rating>> groupedList 然后我将其映射为仅具有最新评级的人员对象列表

groupedList.entrySet().stream.map(element -> new Person(element.getKey(), element.getValue().stream().max(Comparator.comparing(Rating::getRatingDate)).stream().collect(Collectors.toList())))

这里的问题是,当我已经有了一个具有最新评级的人列表时,最好的方法是只返回一个评级最低的人。 我正在考虑使用 .reduce() 方法,但我总是得到一个包含初始列表中所有人的列表

这里是关于如何实现的完整功能示例。不同之处在于我将评级更改为 int 以便于比较。然而,将它适应 String 类型应该不难。

这段代码的重要部分是

persons.stream().min((e1, e2) -> e1.ratingList.stream().min((o1, o2) -> o1.rating - o2.rating).get().rating
                        - e2.ratingList.stream().min((o1, o2) -> o1.rating - o2.rating).get().rating).get()

它的作用是根据最低评分比较人,找到评分最低的人。

另一种方法需要一个附加字段,您可以将最低评分映射到该字段。这种方法看起来更干净,也可能性能更高:

persons.stream()
                .map(e -> t.new Person(e.id, e.ratingList.stream().min((o1, o2) -> o1.rating - o2.rating).get().rating))
                .min((e1, e2) -> e1.lowestRating - e2.lowestRating).get()

我改编的类是:

class Person {
    private String id;
    private List<Rating> ratingList;
    private int lowestRating;

    public Person() {

    }

    public Person(String id2, int rating) {
        id = id2;
        lowestRating = rating;
    }

}

class Rating {
    private int rating;
    private LocalDate ratingDate;

    Rating(int rating, LocalDate date) {
        this.rating = rating;
        ratingDate = date;
    }
}