我正在尝试在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;
}
再次感谢您的时间和帮助。
答案 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<>()
。