java - Vararg 谓词与 Java 8 流

标签 java functional-programming java-8 java-stream

<分区>

给定以下函数:

public static <X> List<X> filterWithVarargPredicates(
        List<X> allProducts,
        Predicate<X>... predicates
    ) {
        for (Predicate<X> predicate : predicates) {
            allProducts = allProducts.stream()
                .filter(predicate)
                .collect(toList());
        }

        return allProducts;
    }

有没有什么方法可以使用所有谓词而不必遍历它们并重新分配给列表?例如,如果 .stream() 有一个接受可变参数的过滤器,或者以某种方式在单个流中执行此操作,那就太好了。

最佳答案

我可以建议创建一个结合所有其他谓词的新谓词:

Predicate<X> allPredicates = x -> Arrays.stream(predicates)
          .mapToInt(predicate -> !predicate.test(x)? 1: 0).sum()==0;
allProducts = allProducts.stream().filter(allPredicates).collect(toList());

编辑 来自@Holger 答案的更好方法 How to apply multiple predicates to a java.util.Stream?

Predicate<X> allPredicates = Arrays.stream(predicates)
                                   .reduce(Predicate::and)
                                   .orElse(x->true);

关于java - Vararg 谓词与 Java 8 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32900516/

相关文章:

java - 解码时出现意外元素

javascript - 函数式 javascript 和 RxJS 中的依赖注入(inject)和模拟

scala - 在Scala中将方法提取到独立函数

java - 如何使用 java 或 scala 处理大文件的最后一 block

java - 有没有人发现 OSGi 在企业应用程序中很有用?

java - 如何使用 Ant 检查已签名的 jar 文件?

Java Swing : labels and fields apper only after resizing

java - 什么是惯用的 "functional"方法来获取 Optional<String> 并在 null 或空时返回默认字符串,否则返回修改后的字符串?

java - 我可以在 Java 7 应用程序中使用使用 Java 8 编译的库吗?

java - 将儒略日期转换为即时日期