首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从给定产品类别的产品列表中获取订单列表

从给定产品类别的产品列表中获取订单列表
EN

Stack Overflow用户
提问于 2022-03-01 06:45:22
回答 3查看 322关注 0票数 0

OrderList - Id,状态,产品列表.

ProductList - Id,名称,类别。

获得一个订单列表,列出属于“婴儿”Java 8类的产品列表

我试过了

代码语言:javascript
运行
复制
orderList.stream().flatMap(prodCat -> prodCat.getProduct().stream())
        .filter(cat -> cat.getCategary()=="Baby").forEach(System.out::println);

它只返回产品类型的列表。我正在寻找退货单。

EN

回答 3

Stack Overflow用户

发布于 2022-03-01 06:51:29

如果您正在寻找具有特定类别的某些产品的订单,可以在anyMatch()中使用filter(),如下所示:

代码语言:javascript
运行
复制
orderList.stream()
        .filter(o -> o.getProducts()
                .stream()
                .anyMatch(p -> p.getCategory().equals("Baby")))
        .forEach(System.out::println);
票数 0
EN

Stack Overflow用户

发布于 2022-03-01 10:12:41

如果要作为List获得流管道的执行结果,则应该使用collect()作为终端操作,使用Collectors.toList()作为参数。

或者,作为Java 16以后可用的另一种选择,您可以使用toList()作为终端操作,它返回一个不变的列表。

下面的方法迭代orders的列表,并为其products列表中包含至少一个给定类别的产品的对象创建一个新的Order实例,否则,E 115orderE 216将被丢弃。然后将订单收集到新的列表中。

代码语言:javascript
运行
复制
public static List<Order> getOrdersOfCategory(List<Order> orderList, String category) {
    return orderList.stream()
            .map(order -> getNewOrderOfCategory(order, category)) // creating a new Order object that contains a filtered List of products
            .filter(Optional::isPresent) // removing the orders that have no products of a given category at all
            .map(Optional::get)
            .collect(Collectors.toList());
}

下面的方法的职责是创建Order类的新实例。它们中的每一个都将与经过过滤的产品列表相关联。

此方法返回的结果类型为Optional<Order>,以便表示过滤后的产品列表为空并丢弃订单的情况。

代码语言:javascript
运行
复制
public static Optional<Order> getNewOrderOfCategory(Order order, String category) {
    List<Product> filteredProducts = getProductsOfCategory(order.getProduct(), category);

    return filteredProducts.isEmpty() ? Optional.empty() : // no target products
                                        new Order(order.getId(),
                                                  order.getStatus(),
                                                  filteredProducts);
}

该方法用于从给定列表中提取给定类别的产品。

代码语言:javascript
运行
复制
public static List<Product> getProductsOfCategory(List<Product> products, String category) {
    return products.stream()
            .filter(prod -> prod.getCategary().equals(category))
            .collect(Collectors.toList());
}

Note

不要将对象与双等号进行比较,始终使用方法instead;

  • It'll be更好地将产品类别实现为枚举,而不是依赖字符串。所有产品类别都将定义在一个地方,如果您要做一个错误,这将是相当明显的,因为代码将不会编译.
票数 0
EN

Stack Overflow用户

发布于 2022-03-01 16:42:28

除了字符串之间的equals之外,您的代码是正确的。注意:

这个等式是false,因为它比较了引用:

代码语言:javascript
运行
复制
"Baby" == new String("Baby")

这个等式是true,因为它比较了以下值:

代码语言:javascript
运行
复制
"Baby".equals(new String("Baby"))

这是最后的结果:

代码语言:javascript
运行
复制
orderList.stream()
         .flatMap(prodCat -> prodCat.getProduct().stream())
         .filter(cat -> "Baby".equals(cat.getCategary()))
         .forEach(System.out::println);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71304656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档