Java嵌套过滤器和嵌套流


class Item {
int id;
List<PriceDetails> priceDetails;
String itemName;
}

class PriceDetails {
int price;
}

我在一个JSON文件中得到多个项目。我试图过滤priceDetails与空价格(不是项目,只是删除列表中所有的priceDetails与空价格)

我能够编写Java代码并按预期工作,但我不知道如何使用Java流编写。有人能帮帮我吗?

提前感谢。

Java Code:

public static List<Item>  filterByEmptyPrice(List<Item> items) {
List<Item> result= new ArrayList<>();
for(int i=0;i<items.size();i++) {
List<PriceDetails> temp= new ArrayList<>();
for(int j=0;j<items.get(i).PriceDetails.size();j++) {
if(nonNull(items.get(i).PriceDetails) && nonNull(items.get(i).priceDetails.get(j).priceDetails.price)) {
temp.add(items.get(i).priceDetails.get(j));
}
}
items.get(i).priceDetails= temp;
result.add(items.get(i));
}
return result;
}

您的filterByEmptyTicketPrice()方法不能与您给出的ItemPriceDetails模型编译。

正确的基于循环的实现应该是:

public static List<Item> filterByEmptyTicketPrice(List<Item> items) {
List<Item> result = new ArrayList<>();
for (Item item : items) {
List<PriceDetails> temp = new ArrayList<>();
for (PriceDetails priceDetails : item.priceDetails) {
if (nonNull(priceDetails.price)) {
temp.add(priceDetails);
}
}
// bug: you mutate your method input here
item.priceDetails = temp;
result.add(item);
}
return result;
}

另外,如上所述,您正在改变输入items。在不改变输入的情况下对流执行此操作的正确方法是:

public static List<Item> filterByEmptyTicketPrice(List<Item> items) {
return items.stream()
.map(item -> new Item(filterPrices(item.priceDetails)))
.collect(Collectors.toList());
}
static List<PriceDetails> filterPrices(List<PriceDetails> priceDetailsList) {
return priceDetailsList
.stream()
.filter(priceDetails -> priceDetails.price != null)
.collect(Collectors.toList());
}
这个例子假设您已经添加了一个新的Item构造函数,如:
public Item(List<PriceDetails> priceDetails) {
this.priceDetails = priceDetails;
}

正如其他人提到的,您应该更新模型,使用getter来访问priceDetailsprice,使它们在您的ItemPriceDetails类中私有。

最新更新