注册
登录
google guava
Java谓词
返回
Java谓词
作者:
狗头军师
发布时间:
2024-12-19 06:16:40 (9天前)
我正在研究Predicate在Java 中使用的代码。我没用过Predicate。有人可以指导我学习任何有关PredicateJava的教程或概念性解释及其实现吗?
收藏
举报
2 条回复
1#
回复此人
v-star*위위
|
2020-08-11 18-38
我假设您是在谈论com.google.common.base.Predicate
番石榴。 从API: 确定给定输入的true或false值。例如,一个RegexPredicatemay可能实现Predicate
,并且为匹配给定正则表达式的任何字符串返回true。 这本质上是boolean测试的OOP抽象。 例如,您可能有这样的帮助方法: static boolean isEven(int num) { return (num % 2) == 0; // simple } 现在,给定一个List
,您只能处理这样的偶数: List
numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } } 使用Predicate,将if测试抽象为一种类型。这使它可以与API的其余部分进行互操作,例如,该API Iterables具有许多采用的实用方法Predicate。 因此,您现在可以编写如下内容: Predicate
isEven = new Predicate
() { @Override public boolean apply(Integer number) { return (number % 2) == 0; } }; Iterable
evenNumbers = Iterables.filter(numbers, isEven); for (int number : evenNumbers) { process(number); } 请注意,现在不进行if测试,for-each循环要简单得多。Iterable
evenNumbers通过filter使用定义,我们已经达到了更高的抽象层次Predicate。 API链接 Iterables.filter 返回满足谓词的元素。 关于高阶函数 Predicate允许Iterables.filter充当所谓的高阶函数。它本身具有许多优点。拿List
numbers上面的例子。假设我们要测试所有数字是否为正。我们可以这样写: static boolean isAllPositive(Iterable
numbers) { for (Integer number : numbers) { if (number < 0) { return false; } } return true; } //... if (isAllPositive(numbers)) { System.out.println("Yep!"); } 使用Predicate,并与其余库进行互操作,我们可以这样编写: Predicate
isPositive = new Predicate
() { @Override public boolean apply(Integer number) { return number > 0; } }; //... if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!"); } 希望您现在可以在例程的更高抽象中看到该值,例如“通过给定谓词过滤所有元素”,“检查所有元素是否满足给定谓词”等,以获得更好的代码。 不幸的是Java没有一流的方法:您无法将方法传递给Iterables.filter和Iterables.all。当然,您可以在Java中传递对象。因此,Predicate定义了类型,然后传递实现此接口的对象。 也可以看看 维基百科/高阶功能 Wikipedia /过滤器(高阶功能)
编辑
登录
后才能参与评论