猿问

如何将 java 8 流收集/减少到 pojo 中?

看代码:


Collection<MyDto> col = ...


MyBuilder builder = new MyBuilder(); 

for (MyDto dto: col) {

    switch (dto.getType()) {

        case FIELD1:

            builder.field1(dto.getValue());

            break:

        case FIELD2:

            builder.field2(dto.getValue());

            break:

    }    

}


Some result = builder.build();

有没有办法用流来做到这一点,比如:


Some result = col.stream().collect(...)

请注意,所有流值都被收集到单个 pojo 中,而不是集合、流或映射。


九州编程
浏览 154回答 3
3回答

慕尼黑8549860

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

相关分类

Java
我要回答