java谓词_在Java中谓词

我假设你正在谈论来自Guava的com.google.common.base.Predicate 。

从API:

确定给定input的true值或false值。 例如,一个RegexPredicate可能实现了Predicate ,并且对任何匹配给定正则expression式的string返回true。

这本质上是一个booleantesting的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 , iftesting被抽象为一个types。 这使得它可以与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没有iftesting,现在for-each循环要简单得多。 通过使用Predicate进行filter ,我们定义了Iterable evenNumbers ,从而达到了更高的抽象级别。

API链接

Iterables.filter

返回满足谓词的元素。

在高阶函数上

Predicate允许Iterables.filter作为所谓的高阶函数。 就其本身而言,这提供了许多优点。 以上面的List numbers例子。 假设我们要testing所有数字是否都是正数。 我们可以写这样的东西:

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没有一stream的方法:你不能将方法传递给Iterables.filter和Iterables.all 。 当然,您可以在Java中传递对象 。 因此,定义了Predicatetypes,而是传递实现此接口的对象 。

也可以看看

维基百科/高阶函数

维基百科/filter(高阶函数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值