Predicate 实现 And 和 Or的逻辑

需求

给一个集合,找到满足添加的对象,一下条件可能会动态的变化,有时候只需要满足一个,有时候需要满足两个。。。

 1、大于。。
2、小于。。
3、是偶数

使用 Predicate完成需求

Predicate主要作用就是输入一个参数,输出一个Boolean值,用于判断这个输入的参数是否满足某个条件 Predicate 接口里面 一个默认方法 ,可以完成多个条件的组合

 default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}

default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}

测试代码:

public class RequestParam {
private String packageId;
private String data;
private boolean isFlow;
public RequestParam(String packageId, String data, boolean isFlow) {
try {
this.packageId = packageId;
this.data = URLEncoder.encode(data, "UTF-8");
this.isFlow = isFlow;
}catch (Exception e){
e.printStackTrace();
}
}

public String getPackageId() {
return packageId;
}

public String getData() {
return data;
}

public boolean isFlow() {
return isFlow;
}

@Override
public String toString() {
return "packageId="+packageId+"&data="+data+"&isFlow="+isFlow+"";
}
}
public class PredicateTest {

public static void main(String[] args) {
List<RequestParam> list = new ArrayList<>();
RequestParam requestParam1 = new RequestParam("test/111","111",true);
RequestParam requestParam2 = new RequestParam("test/222","222",false);
RequestParam requestParam3 = new RequestParam("test/333","333",false);
list.add(requestParam1);
list.add(requestParam2);
list.add(requestParam3);

Predicate<RequestParam> condition1 = value -> value.getPackageId().startsWith("test") ;
Predicate<RequestParam> condition2 = value -> value.getData().length()==3;
Predicate<RequestParam> condition3 = value -> value.isFlow() == false ;
Predicate<RequestParam> predicate = condition1.and(condition2.or(condition3));
AtomicInteger count= new AtomicInteger();
list.forEach(v -> {
if(predicate.test(v)){
count.getAndIncrement();
}
});
System.out.println("符合帅选条件的数量:"+count);

}
}

 


相关推荐

  • 听闻Teradata退出中国,我想起了我经历过的一个数仓项目
  • 如何实现一个任务调度系统?
  • Redis 替代品强势来袭,性能提升一倍!!
  • ChatGPT核心方法可用于AI绘画,效果飞升47%,通讯作者:已跳槽OpenAI
  • ​ACL 2023 Workshop | “多语言文档对话”挑战赛启动!
  • 关于AGI与ChatGPT,Stuart Russell与朱松纯这么看
  • 16岁男生筋膜枪按摩眼睛致白内障;明天起香港口罩令全面取消;日本新生儿跌破80万人......|酷玩日爆
  • 不要和XX人说累 | 每日一冷
  • 这个事,日本真干了!
  • 不能忍,得罪人也得揭它老底,别再被五常大米忽悠了!
  • 加强半导体基础能力建设 点亮半导体自立自强发展的“灯塔”
  • 冲牙器,真的太太太太好用了!
  • 互联网大厂要给大家“发钱”,为啥还被骂?
  • ChatGPT思考:探索智能的极限
  • 如何设计一个通用的风控系统
  • 没写过复杂 React 组件?来实现下 AntD 的 Space 组件吧
  • “毒列车”数百万升毒废水或注入得州地下;圣彼得堡普尔科沃机场附近现“不明飞行物”;意大利黑手党头目用床单索降越狱 | 每日大新闻
  • 3 个骚气满满的 ChatGPT 开源项目!
  • 百度工程师浅谈分布式日志
  • 高并发场景下常见的限流算法及方案介绍