Почему не работает 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() стал вызываться.

→ Ссылка