Java流从element方法分配过滤谓词

我试图在
Java流中使用对象的方法来设置过滤器.例如:

//Full of Test objects that have a method getPredicate() that returns a valid predicate (ex d -> d.getName.equals("Test")). 
 ArrayList<Test> testArray = new ArrayList<Test>(); 

testArray
 .stream()  
 .filter(*CURRENTELEMENT*.getPredicate())  //Goal
 .forEach(System.out::println);

来自getPredicate()的返回lambda可以是任何东西,因为这个目标是拥有一个动态过滤器,在这种情况下可以由Test对象设置.

在此先感谢您的帮助!这是我的第一篇文章,所以我希望我解释自己好.

编辑/更新:
以下是Test对象的getPredicate()方法:

    public Predicate<Test> getPredicate(String name, String id) {

    List<Predicate<Test>> allFilters = Arrays.asList();
    Predicate<Test> aggregateFilters;

        allFilters.add(d -> d.getName().equals(name));
        allFilters.add(d -> d.getId().equals(id));

        //Chain all filter predicates together using "or" method. 
            aggregateFilters= allFilters
                    .stream()
                    .reduce(d -> false, Predicate::or);

            // Returns a valid filter lambda expression
            // If I wasn't trying to get the aggregateFilters variable from this method, I could 
            // statically assign it and plug it right in and it works. ex. .filter(aggregateFilters)
            return aggregateFilters; 
}

再次感谢您的时间和帮助.

最佳答案 你可以做:

testArray.stream().filter(e -> e.getPredicate("some_name", "some_id").test(e)).forEach(System.out::println);

其中Test定义在您的问题中.

为什么我没有看到getPredicate方法是Test类的实例成员,因为它不依赖于任何实例成员.相反,您应该将其视为静态方法,这样您将拥有:

testArray.stream().filter(e -> Test.getPredicate("some_name", "some_id").test(e)).forEach(System.out::println);

注意:初始化为Arrays.asList()的列表将在add方法中抛出UnsupportedOperationException,因为它是一个不可变对象.相反,您可以将其初始化为新的ArrayList<>().

点赞