There is ObjectOuter which contains another object called ObjectInner which is having an ID. We need to remove Redundant ObjectOuter having duplicate ObjectInner Ids. (We have another DateFinish object in picture)
public static List<ObjectOuter> removeRedundantObject(List<ObjectOuter> ObjectOuterOriginal){
if(ObjectOuterOriginal.size() == 1) {
return ObjectOuterOriginal;
}
List<ObjectInner> allObjectInner = ObjectOuterOriginal.stream().map(ObjectOuter::getObjectInner).collect(toList());
List<Long> allObjectInnerIds = allObjectInner.stream().map(ObjectInner::getObjectInnerId).collect(toList());
List<ObjectOuter> myFinalObjectOuter = new ArrayList<>();
if(ObjectOuterOriginal.size() == allObjectInnerIds.stream().distinct().collect(Collectors.toList()).size()){
return ObjectOuterOriginal;
}
Set<Long> duplicateObjectOuter = CommonUtils.getDuplicateNumbers(allObjectInnerIds); //Returns numbers which are duplicate in set
if(SetUtils.emptyIfNull(duplicateObjectOuter).isEmpty()){
return ObjectOuterOriginal;
} else {
duplicateObjectOuter.forEach((objectInnerId) -> {
List<ObjectOuter> myOwnObjectOuter = ObjectOuterOriginal.stream().filter(d -> d.getObjectInner().getObjectInnerId().equals(objectInnerId) && d.getDateFinish()==null).collect(Collectors.toList());
if(ListUtils.emptyIfNull(myOwnObjectOuter).isEmpty()) {
LocalDate maxDate = ObjectOuterOriginal.stream().filter(d -> d.getObjectInner().getObjectInnerId().equals(objectInnerId) && d.getDateFinish()!=null).map(u -> u.getDateFinish()).max(LocalDate::compareTo).get();
List<ObjectOuter> ownObjectOuter = ObjectOuterOriginal.stream().filter(d -> d.getObjectInner().getObjectInnerId().equals(objectInnerId) && d.getDateFinish()!=null).filter(d -> d.getDateFinish().compareTo(maxDate) == 0).collect(toList());
myFinalObjectOuter.addAll(ownObjectOuter);
} else {
myFinalObjectOuter.addAll(myOwnObjectOuter);
}
});
duplicateObjectOuter.forEach((objectInnerId) -> {
ObjectOuterOriginal.removeIf(d -> d.getObjectInner().getObjectInnerId().compareTo(objectInnerId) == 0);
});
ObjectOuterOriginal.addAll(myFinalObjectOuter);
}
return ObjectOuterOriginal;
}
Also we need to use filter on innerObject to select only those ids whose date is either NULL or having max date among duplicate elements; where date is located in outer object.
Above code is executing properly but it is suggested to handle it in more elegant way in Java 8. I can only think of omitting first if statement. but is there any scope of merging statements in Java-8 for above snippet?