如何在Java中处理流的突变


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

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

注意:我正在尝试改变我的项目输入,因为我想让项目中的所有字段都是相同的,除了这个priceDetails,所以我正在改变项目,只是试图添加一个新的priceDetails到相同的项目

我能够编写Java代码,并且它按预期工作,但我不知道如何使用Java流编写。

代码:

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);
}
}
item.priceDetails = temp;
result.add(item);
}
return result;
}

我有这个基于流的代码,但我想要具有突变的代码

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());
}
public Item(List<PriceDetails> priceDetails) {
this.priceDetails = priceDetails; }

问题在这里:

map(item -> new Item(filterPrices(item.priceDetails)))

它创建了一个新的Item,我正在失去项目中其他字段的所有值。我不想丢失项目的所有其他字段,只是想用过滤的priceDetails更新项目(如果我找到null值)。

与其使用流,我想你可以去掉所有包含null价格的priceDetails,因为它们几乎没有用。

你可以使用Java 8removeIf,这是一个批量操作,你可以在任何可变集合上执行。它将删除与给定谓词匹配的所有元素。

items.forEach(Item -> item.getpriceDetails()
.removeIf(priceDetail -> priceDetail.getPrice() == null));

旁注:在声明字段时不要跳过访问修饰符。不要直接访问属性,而是使用getter。如果你的主要背景是JavaScript,你可能会习惯这一点,但在Java中,这不是一个好的做法。类成员必须使用访问修饰符封装在类中,为了使与它们交互成为可能,您应该提供对它们的有限访问。

相关内容

最新更新