为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2021-09-15 15:46:37
看代码: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 中,而不是集合、流或映射。
查看完整描述

3 回答

?
慕尼黑8549860

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());


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信