2015-05-23 21 views
1

我刚开始在this Oracle website上查看流。立即看到下面的代码的一个问题是:如果我想重用过滤器逻辑,例如有个人的方法是“isAdult”吗?使用具有自定义功能接口的流

由于它不接受参数Person,因此这不适用于流作为方法引用。类似地,我将无法创建一个筛选器,它接受和使用年龄创建可参数化的“isOlderThan”逻辑的附加int参数。

我找不到一种方式将流与定制的功能接口一起使用。你会如何模拟这种行为?我觉得在上面的场景中创建一个静态的“isAdult”方法不是一个非常干净的解决方案,也不是用这种方法创建一个“PersonChecker”对象。

List<Person> list = roster.parallelStream().filter((p) -> p.getAge() > 18).collect(Collectors.toList()); 

谢谢

回答

4
List<Person> list = roster.parallelStream().filter((p) -> p.getAge() > 18).collect(Collectors.toList()); 

如果我想重用过滤逻辑,例如有个人的方法是“isAdult”吗?

List<Person> list = roster.parallelStream().filter(Person::isAdult).collect(Collectors.toList()); 

List<Person> list = roster.parallelStream().filter(p -> p.isAdult()).collect(Collectors.toList()); 

我将无法建立,它接受一个过滤器和额外的int参数与年龄来创建参数化“isOlderThan”的逻辑。

List<Person> list = roster.parallelStream().filter(p -> p.isOlderThan(18)).collect(Collectors.toList()); 

我看不出有什么自定义功能接口与你的问题做。 Predicate是您需要的唯一函数接口,而lambda和方法引用是创建Predicate实例的极其简单的方法。

+0

谢谢,并为这个微不足道的问题道歉,它来自方法引用(我尝试使用p :: isAdult)的一个不相关的误解,加上错误的想法,因为谓词“测试”方法接受1参数,所以必须由拉姆达。 – user1578796