我需要一个与Collectors.toSet()
几乎相同,但具有自定义整理器的收集器。我很希望能够做类似的事情:
myCollector = Collectors.toSet();
myCollector.setFinisher(myCustomFinisher);
并完成,但这似乎是不可能的。我能看到的唯一选择是,它实际上是使用
Collectors.toSet()
重新创建Collector.of()
的,它不是很干。有没有办法采用现有的收集器并如上所述进行修改?
编辑
一些答案推荐了以下内容:
Collector<T, ?, Set<T>> toSet = Collectors.toSet();
return Collector.of(
toSet.supplier(),
toSet.accumulator(),
toSet.combiner(),
yourFinisher,
toSet.characteristics());
但是,我的自定义装订器实际上并未返回Set;它使用累积集返回其他内容。这样做的事实使我陷入了泛型的 hell ,我仍在翻遍。
最佳答案
这就是 collectingAndThen(collector,finisher)
所做的。
自定义装订器不会替换旧的装订器(如果有的话),但会与之合并(例如 oldFinisher.andThen(newFinisher)
),但是toSet()
的当前实现仍然没有装订器(身份装订器)。
因此,您要做的就是collectingAndThen(toSet(),myCustomFinisher)
…