java - 如何使用 java 8 stream api 更正编写代码?

标签 java lambda java-stream

我正在学习 Java 8,我想用 java Stream 重写普通的 java 代码。何做得更好。 我的代码:

public Set<Product> getProductsByFilter(Map<String, List<String>>filterParams) {

    Set<Product> productsByBrand = new HashSet<Product>();
    Set<Product> productsByCategory = new HashSet<Product>();
    Set<String> criterias = filterParams.keySet();
    if (criterias.contains("brand")) {
        for (String brandName : filterParams.get("brand")) {
            for (Product product : listOfProducts) {
                if (brandName.equalsIgnoreCase(product.
                        getManufacturer())) {
                    productsByBrand.add(product);
                }
            }
        }
    }

    if (criterias.contains("category")) {
        for (String category : filterParams.get("category")) {
            productsByCategory.addAll(this.
                    getProductsByCategory(category));
        }
    }
    productsByCategory.retainAll(productsByBrand);
    return productsByCategory;
}

我不知道如何在 if (criterias.contains("brand")) 中更正重新格式化代码。

最佳答案

如果代码有效,为什么要更改它? , 不过,这里有一个使用流 API 的解决方案:

public Set<Product> getProductsByFilter(Map<String, List<String>> filterParams) {

    Set<Product> productsByBrand = filterParams.containsKey("brand") ?
                filterParams.get("brand")
                         .stream()
                         .flatMap(brandName -> listOfProducts.stream()
                                            .filter(product -> brandName.equalsIgnoreCase(product.getManufacturer())))
                         .collect(Collectors.toCollection(HashSet::new)) : new HashSet<>();

   Set<Product> productsByCategory =
            filterParams.containsKey("category") ?
                  filterParams.get("category")
                               .stream()
                               .flatMap(category -> this.getProductsByCategory(category).stream())
                               .collect(Collectors.toCollection(HashSet::new)) : new HashSet<>();

        productsByCategory.retainAll(productsByBrand);
        return productsByCategory;
}

或者按照@shmosel 的建议,您可以使用 getOrDefault 来避免三元运算符。 :

Set<Product> productsByBrand = 
       filterParams.getOrDefault("brand", Collections.emptyList())
                   .stream()
                   .flatMap(brandName -> listOfProducts.stream()
                              .filter(product -> brandName.equalsIgnoreCase(product.getManufacturer())))
                   .collect(Collectors.toCollection(HashSet::new));

Set<Product> productsByCategory =
      filterParams.getOrDefault("category", Collections.emptyList())
                  .stream()
                  .flatMap(category -> this.getProductsByCategory(category).stream())
                  .collect(Collectors.toCollection(HashSet::new));

关于java - 如何使用 java 8 stream api 更正编写代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50651580/

相关文章:

java - Java 8 中的多个空值检查

c# - 将字段传递给函数以对该字段进行排序

c# - 从 lambda 表达式中排除 null 或空字符串值

java - 在 Java 8 中反转比较器

java - 杀死在 Java 中调用的子进程的问题

python - 有没有办法在 python 的 lambda 中执行 "if"?

lambda - 使用具有自定义条件的 java8 流从另一个对象创建对象列表

java - 重新定义方法会覆盖以前的重新定义

java - 轻量级 JMS 代理

java - 进程启动后更改 ProcessBuilder 的环境变量