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

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

使用 Java 8 過濾對象列表并將過濾結果映射回同一列表

使用 Java 8 過濾對象列表并將過濾結果映射回同一列表

皈依舞 2023-10-12 17:09:52
我有一個包含對象列表的列表,我想從列表中僅檢索活動記錄。下面是我正在嘗試的代碼,但它沒有正確過濾。 private List<SkuList> getActiveSkuListsAndSkuListLineItem(List<SkuListEntity> skuListEntityList) {return skuListEntityList.stream()    .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))    .map(x -> x.getSkuListLineItems())    .flatMap(x -> x.stream()        .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId())))    .map(x -> x.getSkuListEntity())    .collect(Collectors.toList())    .stream().map(x -> skuListMapper.toSkuListResource(x)).collect(Collectors.toList());}上面的代碼正在檢索所有記錄,無論過濾器 (ACTIVE) 條件如何。如果我破壞上面的代碼,如下所示:skuListEntityList = skuListEntityList.stream()        .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))        .collect(Collectors.toList()); List<SkuListLineItemEntity> skuListLineItemEntityList = skuListEntityList.stream()    .flatMap(x -> x.getSkuListLineItems().stream()        .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId())))    .collect(Collectors.toList());那么skuListEntityList對象skuListLineItemEntityList只包含活動記錄。當我將邏輯合并到一個 return 語句中時,我在上面做的事情出了什么問題。
查看完整描述

1 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

如果沒有實際的類,很難測試您的代碼,但是您的第一個流中會添加很多噪音。


下面是您的原始代碼,其中添加了注釋,希望能夠消除您添加的一些額外噪音。


return skuListEntityList.stream()

    .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))

    .map(x -> x.getSkuListLineItems())

    .flatMap(x -> x.stream()

        .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId())))

    .map(x -> x.getSkuListEntity())//remove and simply operate on x below

    .collect(Collectors.toList())//This is not needed as you're already working with a stream

    .stream()//This is not needed as you're already working with a stream

    .map(x -> skuListMapper.toSkuListResource(x/*x.getSkuListEntity() remove map above*/)).collect(Collectors.toList());


你的答案應該看起來更符合這個思路。盡管沒有充實的類,我不能保證您的邏輯按照您的預期工作。


        return skuListEntityList.stream()

                .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))

                .flatMap(x -> x.getSkuListLineItems().stream())

                .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId()))

                .map(x -> skuListMapper.toSkuListResource(x.getSkuListEntity()))

                .collect(Collectors.toList());

我建議閱讀 https://www.baeldung.com/java-difference-map-and-flatmap 和 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package- summary.html 準確了解您在每個中間操作中所做的事情。


如果您對到底發生了什么感到困惑,請刪除方法鏈接并使用調試器查看調用的實際返回值。


IE。


Stream<SkuListEntity> skuListEntityStream = skuListEntityList.stream();

Stream<SkuListEntity> filteredSkuListEntityStream = skuListEntityStream.filter();

...


查看完整回答
反對 回復 2023-10-12
  • 1 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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