JAVA stream()匹配十八位身份证

这篇博客介绍了如何利用Java Stream的filter()和map()方法匹配和筛选18位身份证号。通过定义正则表达式,对User对象列表进行流式处理,实现高效的身份信息验证。示例代码详细展示了两种不同的实现方式。

有时会有需求去直接用stream方式去匹配18位身份证号, 下面介绍两种方式

filter()方法使用

先定义正则规则(可以自己替换规则):
String regex = "^([1-6][1-9]|50)\\d{4}(18|19|20)\\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
Pattern pattern=Pattern.compile(regex);
filter()方法:
List<User> userList = list.stream().filter(m -> pattern.matcher(m.getSfzh()).matches())
                    .collect(Collectors.toList());

map()方法使用

 List<User> userList = list.stream().map(m -> {
      System.out.println(pattern.matcher(m.getSfzh()).matches());
      if (pattern.matcher(m.getSfzh()).matches()){
           return m;
      }
      return null;
 }).filter(Objects::nonNull).collect(Collectors.toList());
Java中,为了筛选项目列表并找出同一个人在同一时间段内参与的不同项目,你可以按照以下步骤操作: 1. **数据结构**: 首先,你需要有一个包含项目信息的数据结构,例如`Project`类,其中包含字段如`projectID`, `employeeID`(身份证), `name`(姓名), `startDate`, 和 `endDate`。 ```java public class Project { private String projectID; private String employeeID; private String name; private Date startDate; private Date endDate; // getter and setter methods } ``` 2. **列表存储**: 存储所有项目的集合,比如`List<Project>`。 3. **遍历和筛选**: 使用流(Stream) API 或者传统循环遍历项目列表。对于每个项目,检查其员工信息是否匹配特定的身份证和姓名,并且其开始时间和结束时间是否在给定的时间段内。 ```java List<Project> filteredProjects = projects.stream() .filter(project -> project.getEmployeeID().equals(employeeID) && project.getName().equals(name) && project.getStartDate().between(startDate, endDate) && project.getEndDate().between(startDate, endDate)) .distinctBy(Project::getProjectID) // 这里保证了只保留唯一的项目ID,即使员工在同一时间段内参与多次相同的项目 .collect(Collectors.toList()); ``` 这里假设`between`是一个自定义方法,用于检查日期是否在指定范围内。 4. **结果分析**: `filteredProjects`现在包含了满足条件的项目列表。你可以进一步对这个列表进行分析,比如统计这个人在这个时间段内参与了多少个项目等。 **相关问题--:** 1. Java中如何处理日期比较? 2. 如果项目列表非常大,如何优化这个筛选过程? 3. 如何在数据库查询中实现这种筛选功能?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值