Вы можете сделать это так,
List<MyObject> latestObjects = myObjects.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(MyObject::getId,
Collectors.maxBy(Comparator.comparing(MyObject::getInsertTime))),
map -> map.values().stream().map(op -> op.orElse(null)).collect(Collectors.toList())));
Сначала сгруппируйте объекты по их значению Id, затем уменьшите его, чтобы сохранить только последний объект для каждого значения Id, и, наконец, соберите их в List
.
Обновление
Это может быть улучшено в соответствии с комментарием ниже. Вот расширенная версия.
List<MyObject> latestObjects = myObjects.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(MyObject::getId, Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(MyObject::getInsertTime))),
map -> new ArrayList<MyObject>(map.values())));