3 回答
TA贡献1818条经验 获得超11个赞
假设两个MyBuilder实例能够合并/合并,那么您可以使用Collector.
public class MyCollector implements Collector<MyDto, MyBuilder, Result> {
@Override
public Supplier<MyBuilder> supplier() {
return MyBuilder::new;
}
@Override
public BiConsumer<MyBuilder, MyDto> accumulator() {
return (builder, dto) -> {
// Add "dto" to "builder" based on type
};
}
@Override
public BinaryOperator<MyBuilder> combiner() {
return (left, right) -> left.merge(right);
}
@Override
public Function<MyBuilder, Result> finisher() {
return MyBuilder::build;
}
@Override
public Set<Characteristics> characteristics() {
return Set.of();
}
}
那么你可以这样做:
Collection<MyDto> col = ...;
Result r = col.stream().collect(new MyCollector());
如果您不想自定义实现,Collector可以使用Collector.of(...).
另一种可能更易于维护的方法是让构建器完成所有工作。这样所有的映射逻辑都集中在一个地方。
public class ResultBuilder {
public static Collector<MyDto, ?, Result> resultCollector() {
return Collector.of(ResultBuilder::new, ResultBuilder::add,
ResultBuilder::merge, ResultBuilder::build);
}
public ResultBuilder add(MyDto dto) {
// Do what is needed based on the type of "dto"
return this;
}
public ResultBuilder merge(ResultBuilder other) {
// Merge "other" into "this"
return this;
}
public Result build() {
// Build result and return it
}
}
然后您可以使用带或不带流的构建器。使用流与之前非常相似:
Collection<MyDto> col = ...;
Result r = col.stream().collect(ResultBuilder.resultCollector());
添加回答
举报