Java Steam.filter() 过滤 通过Predicate<T>实现 多条件动态 or and 过滤

2023-05-16

/**
 * ==============================================
 * Copy right 2015-2018 by ja
 * ----------------------------------------------
 * This is not a free software, without any authorization is not allowed to use and spread.
 * ==============================================
 *
 * @author : Jalan
 * @version : v1.0.0
 * @desc : 把对象属性抽象出来,可做为参数传递
 * @since : 2018/2/7 21:07
 */
@FunctionalInterface
public interface ObjectPropertyPredicate<T> {
    /**
     * 把属性当参数传递到方法中,由方法去处理这个属性的值做什么。
     * 传参使用: o -> o.propertyName
     * 接收参数方法内使用:
     *  参数:ObjectPropertyPredicate<FreeReportDataVO> express
     *  Predicate<Object> press = (obj) -> express.getProperty(obj).toString().startsWith("测试");
     *  express.getProperty(obj)
     * @param o
     * @return
     */
    Object getProperty(T o);
}
/**
 *
 * ==============================================
 * Copy right 2015-2018 by Jalan
 * ----------------------------------------------
 * This is not a free software, without any authorization is not allowed to use and spread.
 * ==============================================
 *
 * @author : Jalan
 * @version : v1.0.0
 * @desc : 查询选项
 * @since : 2018/2/7 19:28
 */
public enum FilterModeEnum {
    startsWith ,
    equals,
    contains
}
/**
 * 
 * ==============================================
 * Copy right 2015-2018 by Jalan
 * ----------------------------------------------
 * This is not a free software, without any authorization is not allowed to use and spread.
 * ==============================================
 *
 * @author : Jalan
 * @version : v1.0.0
 * @desc : 测试实体类
 * @since : 2018/2/7 11:58
 */
@ApiModel(description = "测试实体类")
@Data
@EqualsAndHashCode(callSuper = true)
public class TestDataVO{
	private String code;
	private String name;
	private String remark;
}
/**
 * 通过批量过滤条件(codes) 过滤指定对象属性的值 
 * @param dataSource 数据源集合
 * @param codes 过滤条件集合
 * @param express 过滤集合对象目标属性表达式
 * @param filterMode 过滤方式
 * @return 返回符合过滤条件codes的对象集合
 */
public static List<TestDataVO> queryArray(List<TestDataVO> dataSource, List<String> codes, ObjectPropertyPredicate<TestDataVO> express, FilterModeEnum filterMode) {
	List<TestDataVO> result = new ArrayList<>();
	if (dataSource == null) {
		return result;
	}
	if (codes == null || (long) codes.size() == 0) {
		return dataSource;
	}
	if (express == null) {
		return dataSource;
	}
	if (filterMode == FilterModeEnum.startsWith) {
		Predicate<TestDataVO> expressOr = f -> false;
		for (String code : codes) {
			Predicate<TestDataVO> press = (w) -> express.getProperty(w).toString().startsWith(code);
			expressOr = expressOr.or(press);
		}
		result = dataSource.stream().filter(expressOr).collect(Collectors.toList());
	} else if (filterMode == FilterModeEnum.contains) {
		result = dataSource.stream().filter(f -> codes.contains(express.getProperty(f).toString())).collect(Collectors.toList());
	} else if (filterMode == FilterModeEnum.equals) {
		Predicate<TestDataVO> expressOr = f -> false;
		for (String code : codes) {
			Predicate<TestDataVO> press = (w) ->StringUtils.equals(express.getProperty(w).toString(),code);
			expressOr = expressOr.or(press);
		}
		result = dataSource.stream().filter(expressOr).collect(Collectors.toList());
	}
	return result;
}
最后测试:
List<TestDataVO> data = new ArrayList<>();
TestDataVO td1 = new TestDataVO();
td1.setCode("测试A-code");
td1.setName("测试A-name");
TestDataVO td2 = new TestDataVO();
td2.setCode("测试B-code");
td2.setName("测试B-name");
TestDataVO td3 = new TestDataVO();
td3.setCode("测试C-code");
td3.setName("测试C-name");
TestDataVO td4 = new TestDataVO();
td4.setCode("测试D-code");
td4.setName("测试D-name");
TestDataVO td5= new TestDataVO();
td5.setCode("测试E-code");
td5.setName("测试E-name");
data.add(td1);
data.add(td2);
data.add(td3);
data.add(td4);
data.add(td5);

List<String> filterCodeCondition = ArrayList<>();
filterCodeCondition.add("测试A-code");
filterCodeCondition.add("测试C-code");
/**
 * 过滤结果为 td1,td3 对象
 */
List<TestDataVO> filterResult = queryArray(data,filterCodeCondition , TestDataVO::getCode, FilterModeEnum.startsWith);


List<String> filterNameCondition = ArrayList<>();
filterCodeCondition.add("D-name");
filterCodeCondition.add("E-name");
/**
 * 过滤结果为 td4,td5 对象
 */
List<TestDataVO> filterResult = queryArray(data,filterCodeCondition , TestDataVO::getName, FilterModeEnum.contains);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Steam.filter() 过滤 通过Predicate&lt;T&gt;实现 多条件动态 or and 过滤 的相关文章

  • c++ 常见的一些问题总结

    目录 目录 1 深拷贝 xff08 string xff09 深拷贝的实现 xff08 xff09 2 迭代器失效 xff08 vector insert xff0c earse xff09 3 头文件展开问题 4 vector 的深浅拷贝
  • airflow 文档学习(二) - 概念

    1 核心功能 1 1 DAGs 有向无环图 反映所涉及的task的依赖关系 注 xff1a 搜索dag的时候 xff0c airflow只会关注同事包含 34 DAG 34 和 34 airflow 34 字样的py文件 1 2 scope
  • 2014创新工场校园招聘笔试题(9.16北京)

    选择题 1 若进栈序列为a b c d xff0c 进栈过程中可以出栈 xff0c 那么 xff08 xff09 不可能是一个出栈序列 A cbad B bdca C adbc D cdba 2 完全二叉树中编号为i的结点存在右孩子 xff
  • 2014美团校园招聘笔试(10.8北京)

    按照试卷要求不能透露题目具体内容 xff0c 因此本文只写考点 一共六道大题 xff0c 如下 xff1a Q1 基础题 xff0c 给出中序后序 xff0c 求前序 Q2 概率题 xff0c 求期望 Q3 概率题 xff0c 求可能性 Q
  • 2014去哪儿网校园招聘笔试(10.13北京)

    三道大题 43 两题TestCase 编程题 Q1 xff1a 实现一个字符串反转 xff0c 规则如下 xff1a 输入一个字符串str xff0c 一个分隔符delim xff0c 要求实现对分隔符之间的字符串做反转操作 xff0c 但
  • 图像处理算法工程师职位面试题汇总

    最近面试了几个图像的职位 xff0c 汇总一下面试题 图像基础知识 xff1a 1 常用的图像空间 2 简述你熟悉的聚类算法并说明其优缺点 3 请描述以下任一概念 xff1a SIFT SURF LDA PCA 4 请说出使用过的分类器和实
  • 软件开发职位面试题汇总

    10 19 去哪儿面试 1 struct和class的成员函数调用1000次后有什么执行效率方面的差异 xff1f 2 给两个int型数组A和B xff0c 长度都为n xff0c 编程实现A B 61 a1 b1 43 a2 b2 43
  • iOS8 新特性

    苹果公司在WWDC 2014上发布了许多新特性 xff0c 让我们一起来看看都有哪些内容 Contents App Extensions Touch ID Authentication Photos Games Health Kit Fra
  • 获取当前view所在页面的viewController

    一般来说 xff0c 我们可以知道一个viewController所在的view self view xff0c 或者它的子视图 self subViews 然而 xff0c 怎样知道一个view所在页面的viewController呢 x
  • [iOS] Get all UIView subviews with all property values

    转自StackOverFlow span class com style margin 0px padding 0px border 0px color rgb 128 128 128 background transparent span
  • Upgrading the delete confirmation button

    本文转载自andy heydon个人博客 ANDY HEYDON ARCHIVES ABOUT Upgrading the delete confirmation button by Andy iOS has a nice pattern
  • Linux系统的GPIO设置(以UpBoard为例)

    GPIO往往是通过sys文件系统进行操作的 xff0c 当我们需要验证一个GPIO口置1还是置0的话 xff0c 可以通过操作sys文件来完成 UpBoard官方所提供的linux系统已经安装了支持UP Board的RPi GPIO和相应的
  • ubuntu远程桌面

    xff08 一 xff09 可视化界面远程访问Linux服务器 这里以Ubuntu为例 xff0c 最常见的是通过xrdp和vnc这两种远程桌面协议来进行可视化远程操作 1 关于xrdp协议和vnc协议之间区别 参考自 xff1a http
  • 针对Linux 错误make: *** No rule to make target ` ‘, needed by xxx. Stop. (webots调试出现这个错误,原因相同)

    导致出现make No rule to make target 96 needed by xxx Stop 的主要原因就是因为Makefile出现问题 xff0c 编写Makefile的时候多加了空格 括号等原因导致报这个错误 具体的参考实
  • eigen库的安装与基本使用教程

    Eigen是可以用来进行线性代数 矩阵 向量操作等运算的C 43 43 库 xff0c 它里面包含了很多算法 在用C 43 43 写运动控制算法 xff08 例如MPC控制算法 xff09 的时候 由于算法包括矩阵运算 xff0c c 43
  • CMakeLists.txt的简单学习教程汇总

    最近因为要编辑一个T265的例程 xff0c 但是里面的CMakeLists中的含义自己不明白 xff0c 在网上搜集了一些资料 xff0c 对自己学习进行一下总结也是让需要的人更加明白清楚 学习这个的最好的方式是自己理解了以后 xff0c
  • LEGION联想Y7000P Ubuntu18.04的无线网卡驱动安装

    安装无线网卡的驱动的第一步大家应该弄清楚自己的无线网卡型号 建议最好的方式是在Windows下面确定类型 xff0c 在设备管理器中查看对应的无线适配器型号 xff0c 在下载对应的驱动 在Ubuntu下面也可以通过指令进行查看但是看不到具
  • 向量点乘(即内积)和叉乘(即外积、向量积)区别与意义分析

    向量之间的叉乘和点乘 xff0c 概念易混淆 xff0c 分别不清楚 xff0c 因此本文专门对这个概念进行了详细分析介绍 首先 xff0c 介绍一下向量 xff08 Vector xff09 xff0c 在几乎所有的几何问题中 xff0c
  • MATLAB图中加入阴影

    在绘制MATLAB 图时 xff0c 想表示不同的阶段 xff0c 所以将其中一部分用阴影颜色强调出来 xff0c 因此进行了一下绘制图像的知识补充 其中想要的效果是类似于下面这张 xff1a 具体如何实现呢 xff0c 有两种方式 xff
  • Matlab调整子图位置及大小

    为了绘制多个子图的MATLAB图 xff0c 但是使用导出设置时无法将子图全屏铺满整个屏幕 xff0c 因此本文对设置MATLAB子图位置进行了研究 xff0c 达到如下的效果 1 首先 xff0c 明确其中每个变量的含义 xff0c 从M

随机推荐