根据 Java 中的 Max MyObject 属性 将 List<MyObject> 转换为 Map<Integer, String> 8

Converting a List<MyObject> into a Map<Integer, String> based on the Max MyObject property in Java 8

我有一个List<MyObject>。它包含一个 objectId.

的多个记录

MyObject class 长得像

class MyObject{
  int id;
  int objectId;
  String status;
  LocalDate updatedTimestamp;
}

我需要一个 Map<Integer, String>,其中 objectId 作为 Key,相应的 status 作为 Value.

我只需要考虑一个 objectId 最新的 updatedTimestamp.

的记录

不同的时间戳会有不同的status。只需要最新的。

我没有找到实现此目标的方法。我知道我可以通过应用 groupingBy()maxBy().

来获得 Map<integer, Optional<MyObject>>

请指教

可以使用收集器 groupingBy() 结合 collectingAndThen()maxBy() 来完成。

Collector maxBy() 期望 comparator 作为参数并产生可选结果。要创建比较器,我们可以使用 Java 8 方法 Comparator.comparing().

List<MyObject> objects = // initializing the source list.
        
Map<Integer, String> statusByObjectId = objects.stream()
    .collect(Collectors.groupingBy(
        MyObject::getObjectId,
        Collectors.collectingAndThen(
            Collectors.maxBy(Comparator.comparing(MyObject::getUpdatedTimestamp)),
            (Optional<MyObject> result) -> result.orElseThrow().getStatus())
        ));