簡體   English   中英

可以告訴我如何使用 java 8 流重構這個嵌套循環嗎?

[英]Can show me how to refactor this nested loop using java 8 streams?

我有兩個列表parentListsalesList 我需要在循環parentListsalesList如果salesItem.Id== parentItem.Id ,加salesItem到所謂的新名單inner ,並設置innerChildList

for (ParentModel parentItem : parentList) { //list1
    List<InnerModel> inner = new ArrayList<>(); // new list 
    for (SalesModel salesItem : salesList) {  //list2
        if (parentItem.getId() == salesItem.getID()) { // if parent item id == salesItem.id add item to new created list 
            inner.add(new InnerModel(salesItem.getServiceNameEn(),salesItem.getCashierName(), salesItem.getServiceCode()));
        }
    }
    if (inner.size() != 0) {
        parentItem.setHasChild(true);
        parentItem.setChildList(inner);
    } else
        parentItem.setHasChild(false);
}

為了獲得更好的性能,請使用 Streams 將salesList轉換為Map

Map<Integer, SalesModel> salesMap = salesList.stream()
        .collect(Collectors.groupingBy(SalesModel::getID));

在那之后,它可以像這樣完成,盡管我認為這並不比常規的for循環更好。

parentList.stream().forEach(p -> p.setHasChild(salesMap.containsKey(p.getId())));
parentList.stream().filter(salesMap.containsKey(p.getId()))
                   .forEach(p -> p.setChildList(salesMap.get(p.getId())));

正如@Andreas 所說,使用Map可以帶來更好的性能。 我建議將這種方法與Map一起使用。

但是如果你只想用流替換循環,你可以使用下一個:

   parentList.forEach(parentModel -> parentModel.setChildList(salesList.stream()
                .filter(sale -> sale.getId() == parentModel.getId())
                .map(InnerModel::new).collect(Collectors.toList())));

完整代碼示例:

  public static void main(String[] args) {
        List<ParentModel> parentList = Arrays.asList(new ParentModel(1), new ParentModel(2), new ParentModel(3));
        List<SalesModel> salesList = Arrays.asList(new SalesModel(1), new SalesModel(1), new SalesModel(2));
        parentList.forEach(parentModel -> parentModel.setChildList(salesList.stream()
                .filter(sale -> sale.getId() == parentModel.getId())
                .map(InnerModel::new).collect(Collectors.toList())));
        parentList.forEach(System.out::println);
    }


    private static class ParentModel {
        private final long id;
        private List<InnerModel> innerModels;

        public ParentModel(long id) {
            this.id = id;
        }

        public long getId() {
            return id;
        }

        public void setChildList(List<InnerModel> innerModels) {
            this.innerModels = innerModels;
        }

        @Override
        public String toString() {
            return new StringJoiner(", ", ParentModel.class.getSimpleName() + "[", "]")
                    .add("id=" + id)
                    .add("innerModels=" + innerModels)
                    .toString();
        }
    }


    private static class SalesModel {

        private final long id;

        public SalesModel(long id) {
            this.id = id;
        }

        public long getId() {
            return id;
        }

        @Override
        public String toString() {
            return new StringJoiner(", ", SalesModel.class.getSimpleName() + "[", "]")
                    .add("id=" + id)
                    .toString();
        }
    }

    private static class InnerModel {
        private final SalesModel model;

        public InnerModel(SalesModel model) {
            this.model = model;
        }

        @Override
        public String toString() {
            return new StringJoiner(", ", InnerModel.class.getSimpleName() + "[", "]")
                    .add("model=" + model)
                    .toString();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM