简体   繁体   English

Java 嵌套过滤器和嵌套流

[英]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()方法无法使用您提供的ItemPriceDetails 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 访问priceDetailsprice ,使它们在您的ItemPriceDetails类中私有化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM