第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何將 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();有沒(méi)有辦法用流來(lái)做到這一點(diǎn),比如:Some result = col.stream().collect(...)請(qǐng)注意,所有流值都被收集到單個(gè) pojo 中,而不是集合、流或映射。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊

假設(shè)兩個(gè)MyBuilder實(shí)例能夠合并/合并,那么您可以使用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());

如果您不想自定義實(shí)現(xiàn),Collector可以使用Collector.of(...).


另一種可能更易于維護(hù)的方法是讓構(gòu)建器完成所有工作。這樣所有的映射邏輯都集中在一個(gè)地方。


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

    }


}

然后您可以使用帶或不帶流的構(gòu)建器。使用流與之前非常相似:


Collection<MyDto> col = ...;

Result r = col.stream().collect(ResultBuilder.resultCollector());


查看完整回答
反對(duì) 回復(fù) 2021-09-15
  • 3 回答
  • 0 關(guān)注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)