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

时间:2018-04-03 20:55:16

标签: java java-8 java-stream

我正在尝试在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; 
}

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

1 个答案:

答案 0 :(得分:1)

你可以这样做:

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()的列表将在UnsupportedOperationException方法中抛出add,因为它是一个不可变对象。相反,您可以将其初始化为new ArrayList<>()