Это в основном продолжение моего ответа .
Предположим, что я работаю над настраиваемым сборщиком и предположим, что accumulator
всегда добавит некоторый элемент в коллекцию, возвращаемую поставщиком, есть ли вероятность, что при вызове combiner
один из промежуточных результатов будет пусто? Пример, вероятно, намного проще для понимания.
Предположим, у меня есть List
чисел, и я хочу разделить его в списке списков, где 2
- это разделитель. Так, например, у меня есть 1, 2, 3, 4, 2, 8
, результат должен быть [[1], [3, 4], [8]]
. Этого не очень сложно достичь (не судите слишком много кода, я написал что-то быстрое, просто чтобы я мог написать этот вопрос).
List<List<Integer>> result = Stream.of(1, 2, 3, 4, 2, 8)
.collect(Collector.of(
() -> new ArrayList<>(),
(list, elem) -> {
if (list.isEmpty()) {
List<Integer> inner = new ArrayList<>();
inner.add(elem);
list.add(inner);
} else {
if (elem == 2) {
list.add(new ArrayList<>());
} else {
List<Integer> last = list.get(list.size() - 1);
last.add(elem);
}
}
},
(left, right) -> {
// This is the real question here:
// can left or right be empty here?
return left;
}));
Это, вероятно, не имеет значения в этом примере, но вопрос в следующем: могут ли элементы в combiner
быть пустыми List
? Я действительно очень склонен сказать NO
, так как в документации они упоминаются как:
combiner - ассоциативная, не мешающая работе функция без сохранения состояния, которая принимает два контейнера частичных результатов и объединяет их.
Хорошо, что частичное для меня является признаком того, что accumulator
был вызван на них, прежде чем они достигли combiner
, но просто хотел быть уверенным.