предложение, которое я хотел, это отфильтровать список по полю некоторого внутреннего объекта.
таким образом, я нахожу один метод в интернете, например:
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
тогда я использую вот так
list.stream().filter(LambdaUtils.distinctByKey(o -> o.getLogisticsNumber() == null ? o.getId() : o.getLogisticsNumber())).collect(Collectors.toList());
это работает правильно, но я хочу попробовать что-то другое, поэтому я изменяю код не используя функцию, а вместо кода. Например:
list.stream().filter(
x -> {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
Function<DeliveryOrderItemMaterialLogisticInfo ,Object> keyExtractor = o -> o.getLogisticsNumber() == null ? o.getId() : o.getLogisticsNumber();
return seen.putIfAbsent(keyExtractor.apply(x), Boolean.TRUE) == null;
}
).collect(Collectors.toList());
тогда результат - ошибка.
почему? что отличается между этими двумя?