Java Stream如何在条件不满足时跳过元素的映射操作
实现方案
有两种常用的实现方式,你可以根据实际业务场景选择:
方案1:改造映射方法返回Optional(更推荐,空指针安全)
步骤1:修改mapToEmployee方法返回值为Optional<EmployeeEntity>,校验不通过时返回空Optional
private Optional<EmployeeEntity> mapToEmployee(UserEntity userEntity){ // 原有DB检索EmployeeEntity逻辑 EmployeeEntity employeeEntity = // 你的DB查询代码 // 校验存在且处于激活状态 if (employeeEntity != null && Boolean.TRUE.equals(employeeEntity.getIsActive())) { return Optional.of(employeeEntity); } return Optional.empty(); }
步骤2:调整Stream流处理逻辑,过滤掉空Optional后取值
private List<EmployeeEntity> getEmployees(List<UserEntity> users) { return users.stream() .filter(x-> !x.getRelatedEntity().isEmpty()) .map(this::mapToEmployee) // 过滤无效值 .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList()); }
如果你使用Java 9及以上版本,可以省略filter和map的两步操作,直接用
flatMap简化代码:.flatMap(user -> mapToEmployee(user).stream())
方案2:不改动原有映射方法返回值
如果你的mapToEmployee方法在其他地方也有引用,不方便修改返回值,且查询不到对应员工时会返回null,可以直接在Stream中新增过滤规则:
private List<EmployeeEntity> getEmployees(List<UserEntity> users) { return users.stream() .filter(x-> !x.getRelatedEntity().isEmpty()) .map(this::mapToEmployee) // 过滤空值和未激活的员工,Boolean.TRUE.equals避免空指针 .filter(emp -> emp != null && Boolean.TRUE.equals(emp.getIsActive())) .collect(Collectors.toList()); }
注意事项
因为EmployeeEntity中的isActive是包装类Boolean,直接调用emp.getIsActive()可能会触发空指针,用Boolean.TRUE.equals()做判断可以避免该问题。
内容的提问来源于stack exchange,提问作者VIOO66
相关产品推荐
相关产品推荐

