java8 predicate使用,Java8-Predicate的简单使用

Predicate是个断言接口(给定lambda表达式,返回boolean值)

@FunctionalInterface

public interface Predicate{

boolean test(T t);

// &&

default Predicateand(Predicate super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) && other.test(t);

}

// !

default Predicatenegate() {

return (t) -> !test(t);

}

// ||

default Predicateor(Predicate super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) || other.test(t);

}

static PredicateisEqual(Object targetRef) {

return (null == targetRef)

? Objects::isNull

: object -> targetRef.equals(object);

}

}

以上方法都返回Predicate对象,意味着可以支持链式调用,例如:

Predicate p1 = o -> o.equals(a);

Predicate p2 = o -> o.equals(b);

Predicate p3 = o -> o.equals(c);

somelist.stream().filter(p1.and(p2).or(p3)).collect(Collectors.toList());

使用场景:

缓存中有一份List,页面查询该list,并需支持多条件动态过滤。

//模拟缓存数据

//假设有name,age,height等条件

ListuserList = cache.get();

Predicate expressAll = null;

if(StringUtils.isNotBlank(name)){

expressAll = user -> Objects.equals(user.getName(),name);

}

if(Objects.nonNull(age)){

Predicate express = user -> Objects.equals(user.getAge(),age);

if (Objects.isNull(expressAll)) {

expressAll = express;

} else {

expressAll = expressAll.and(express);

}

}

if(StringUtils.isNotBlank(height)){

Predicate express = user -> Objects.equals(user.getHeight(),height);

if (Objects.isNull(expressAll)) {

expressAll = express;

} else {

expressAll = expressAll.and(express);

}

}

if(Objects.isNull(expressAll)){

userList = userList.stream().filter(expressAll).collect(Collectors.toList());

}

这样就像动态拼接sql一样,完成了动态拼接查询条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值