【发布时间】:2018-09-05 09:33:38
【问题描述】:
这基本上是this answer of mine的后续。
假设我正在开发自定义收集器并假设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 之前被调用,但只是想确定一下。
【问题讨论】:
标签: java java-8 java-stream