我需要一个与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)

10-01 12:10