Почему не работает finisher() в Collector?
Использую следующий коллектор:
Collector<UserMeal, List<UserMealWithExcess>, List<UserMealWithExcess>> mealsCollector =
new Collector<UserMeal, List<UserMealWithExcess>, List<UserMealWithExcess>>() {
private Map<LocalDate, Integer> dateExcess = new HashMap<>();
@Override
public Supplier<List<UserMealWithExcess>> supplier() {
return ArrayList::new;
}
@Override
public BiConsumer<List<UserMealWithExcess>, UserMeal> accumulator() {
return (o, o2) -> {
o.add(new UserMealWithExcess(o2.getDateTime(), o2.getDescription(), o2.getCalories()));
dateExcess.merge(LocalDate.from(o2.getDateTime()), o2.getCalories(), Integer::sum);
};
}
@Override
public BinaryOperator<List<UserMealWithExcess>> combiner() {
return (o, o2) -> {
o.addAll(o2);
return o;
};
}
@Override
public Function<List<UserMealWithExcess>, List<UserMealWithExcess>> finisher() {
return (o) -> {
o.forEach(x -> x.setExcess(dateExcess.get(LocalDate.from(x.getDateTime())) > caloriesPerDay));
return o;
};
}
@Override
public Set<Characteristics> characteristics() {
return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
}
};
По какой-то причине не вызывается метод finisher() коллектора, из-за чего логика нарушается. Почему так? Что мне сделать, чтобы вызывался метод finisher()?
Ответы (1 шт):
Автор решения: Zhenyria
→ Ссылка
Удалось выяснить, почему не вызывался метод finisher(). Это происходило из-за того, что метод characteristics() возвращал Characteristics.IDENTITY_FINISH, а данный маркер утверждает, что
Indicates that the finisher function is the identity function and can be elided.
После изменение Characteristics.IDENTITY_FINISH на Characteristics.UNORDERED finisher() стал вызываться.