[英]Can show me how to refactor this nested loop using java 8 streams?
我有兩個列表parentList
和salesList
。 我需要在循環parentList
和salesList
如果salesItem.Id== parentItem.Id
,加salesItem
到所謂的新名單inner
,並設置inner
到ChildList
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.