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()
方法不能与您给出的Item
和PriceDetails
模型编译。
正确的基于循环的实现应该是:
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来访问priceDetails
和price
,使它们在您的Item
和PriceDetails
类中私有。