I have a List<MyObject>. It contains multiple records for one objectId.
MyObject class looks like
class MyObject{
int id;
int objectId;
String status;
LocalDate updatedTimestamp;
}
I need a Map<Integer, String> with objectId as Key and corresponding status as a Value.
I need to consider only the record for one objectId with latest updatedTimestamp.
Different timestamps will have different status. Need only the latest one.
I didn't find a way of achieving this. I know I can get Map<integer, Optional<MyObject>> by applying groupingBy() and maxBy().
Please advise.
CodePudding user response:
It can be done using collector groupingBy() in conjunction with collectingAndThen() and maxBy().
Collector maxBy() expect a comparator as an argument and produces an optional result. To create a comparator, we can make use of the Java 8 method 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())
));
