亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 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 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號