Java对相关联_Java - 将属性与逻辑介词相关联

Predicate是一个布尔值函数,它给出一个输入来测试属性是真还是假。谓词也称为属性,它们是属性的同义词。

我首先定义一个Predicate接口。

public abstract class Predicate {

public abstract boolean eval(T t);

public Predicate and(Predicate super T> p) {...};

public Predicate and(Predicate super T> ... p) {...};

public Predicate negate() {...};

public Predicate or(Predicate super T> p) {...};

public Predicate or(Predicate super T> ... p) {...};

public Predicate xor(Predicate super T> p) {...};

public Predicate xor(Predicate super T> ... p) {...};

}然后,您可以定义每个属性:

public static final Predicate EVEN = new Predicate(){

public boolean eval(Integer n) {

return n % 2 == 0;

}

};假设你想根据它们的属性过滤一组整数,那么我假设你必须定义一个过滤方法(它对应于一个经典的high-order function来过滤给定谓词上的项目):

public static List filter(List extends T> items,

Predicate super T> predicate) {

List result = new ArrayList();

for(T item : items){

if(predicate.eval(item)){

result.add(item);

}

}

return result;

}让我们看一下这个过滤的实例:

List myNumbers = asList(-5,-4,-3,-2,-1,0,1,2,3,4,5);

List onlyEven = filter(myNumbers, EVEN);

List positiveAndEven = filter(myNumbers, POSITIVE.and(EVEN));这种方法的优点是,一旦JDK 8被释放,语言将通过使用lambda expressions提供所有这些功能。

最终,您将替换lambda表达式的属性定义:

public static final Predicate EVEN = n -> n % 2 == 0;

public static final Predicate ODD = n -> n % 2 != 0;

public static final Predicate POSITIVE = n -> n > 0;

public static final Predicate NEGATIVE = n -> n < 0;并且您的过滤将在您的收藏中内置提供,因此您只需执行以下操作:

List myNumbers = asList(-5,-4,-3,-2,-1,0,1,2,3,4,5);

List onlyEven = myNumbers.filter(EVEN).into(new ArrayList());

List positiveEven = myNumbers.filter(POSITIVE.and(EVEN)).into(new ArrayList());

List positiveOrOdd = myNumbers.filter(POSITIVE.or(ODD)).into(new ArrayList());谓词接口将是JDK 8 java.util.functions包的一部分。所以,最终你将能够抛弃你的并使用JDK中内置的那个。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值