根据 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())
));
我有一个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())
));