[英]Java Nested filter and Nested Streams
class Item {
int id;
List<PriceDetails> priceDetails;
String itemName;
}
class PriceDetails {
int price;
}
I am getting multiple items in a JSON file.我在 JSON 文件中得到多个项目。 I am trying to filter
priceDetails
with empty price (not the items, just removing all the priceDetails
in the list with empty price)我正在尝试用空价格过滤
priceDetails
(不是项目,只是删除列表中所有价格为空的priceDetails
)
I am able to write Java code and its working as expected, but I don't know how to write using Java Streams.我能够编写 Java 代码并按预期工作,但我不知道如何使用 Java Streams 进行编写。 Can someone help me?
有人能帮我吗?
Thanks in advance.提前致谢。
Java Code: Java 代码:
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;
}
Your filterByEmptyTicketPrice()
method doesn't compile with the Item
and PriceDetails
model you gave.您的
filterByEmptyTicketPrice()
方法无法使用您提供的Item
和PriceDetails
model 进行编译。
The correct loop based implementation would be:正确的基于循环的实现是:
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;
}
Also, as noted above, you're mutating the input items
.此外,如上所述,您正在改变输入
items
。 The correct way to do this with streams and without mutating the input would be:在不改变输入的情况下使用流执行此操作的正确方法是:
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());
}
This example assumes you've added a new Item
constructor such as:此示例假设您已经添加了一个新的
Item
构造函数,例如:
public Item(List<PriceDetails> priceDetails) {
this.priceDetails = priceDetails;
}
As others mentioned, you should update the model to use getters to access priceDetails
and price
making them private in your Item
and PriceDetails
classes.正如其他人提到的,您应该更新 model 以使用 getter 访问
priceDetails
和price
,使它们在您的Item
和PriceDetails
类中私有化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.