java谓词_Java中的谓词

我假设你说的是从Guava的

com.google.common.base.Predicate。

从API:

Determines a true or false value for a given input. For example, a RegexPredicate might implement Predicate, and return true for any string that matches its given regular expression.

这本质上是一个布尔测试的OOP抽象。

例如,你可能有一个这样的帮助方法:

static boolean isEven(int num) {

return (num % 2) == 0; // simple

}

现在,给定一个List< Integer&gt ;,你只能处理这样的偶数:

List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

for (int number : numbers) {

if (isEven(number)) {

process(number);

}

}

使用谓词,if测试抽象为类型。这允许它与API的其余部分(例如Iterables)进行互操作,这些API有许多使用谓词的实用程序方法。

因此,你现在可以这样写:

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);

}

注意,现在for-each循环在没有if测试的情况下要简单得多。我们已经通过定义Iterable< Integer> evenNumbers,通过使用谓词过滤。

API链接

>返回满足谓词的元素。

在高阶函数

谓词允许Iterables.filter充当所谓的高阶函数。就其自身而言,这提供了许多优点。取列表< Integer>数字示例。假设我们要测试所有数字是否为正数。我们可以这样写:

static boolean isAllPositive(Iterable numbers) {

for (Integer number : numbers) {

if (number < 0) {

return false;

}

}

return true;

}

//...

if (isAllPositive(numbers)) {

System.out.println("Yep!");

}

使用谓词,并与其他库进行互操作,我们可以写成:

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中的对象。因此,定义了谓词类型,并且您传递实现此接口的对象。

也可以看看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值