使用Java 8 Stream按自定义条件(会话中/活跃)从另一列表创建对象列表
使用Java 8 Stream实现Person到UserInfo的转换(满足会话/活跃条件)
没问题,这就给你一个简洁高效的Java 8 Stream实现方案。首先要说明的是,你的Person类定义里没包含「会话状态」和「活跃状态」的字段/方法,我这里默认Person类有两个布尔类型的方法:isInSession()和isActive(),用来判断这两个条件——如果实际字段名不同,你替换成对应的getter就行。
完整实现代码
import java.util.List; import java.util.stream.Collectors; public class PersonToUserInfoConverter { public List<UserInfo> convertToUserInfos(List<Person> persons) { return persons.stream() // 过滤:保留处于会话中 或者 活跃状态的Person .filter(person -> person.isInSession() || person.isActive()) // 映射:将符合条件的Person转换为UserInfo对象 .map(person -> new UserInfo( person.getFirstName(), person.getLastName(), person.getPersonId() )) // 收集结果为UserInfo列表 .collect(Collectors.toList()); } }
关键环节拆解
- 过滤环节:
filter()方法接收一个Predicate,这里用Lambda表达式判断当前Person是否满足「会话中」或「活跃」的任一条件,不符合的会被直接排除在后续流处理之外。 - 映射环节:
map()方法负责类型转换,这里直接调用UserInfo的全参构造器,把Person的对应属性(通过getter获取)传入,完成从Person到UserInfo的转换。如果你的UserInfo没有对应全参构造器,也可以改用链式调用setter的方式:.map(person -> { UserInfo userInfo = new UserInfo(); userInfo.setUFirstName(person.getFirstName()); userInfo.setULastName(person.getLastName()); userInfo.setUserId(person.getPersonId()); return userInfo; }) - 收集结果:
collect(Collectors.toList())把流中的UserInfo对象收集成一个List返回,这是Stream处理的收尾步骤。
额外说明
这个实现完全符合Java 8的函数式编程风格,代码简洁易读,而且Stream会自动处理空列表的情况——如果传入的persons列表为空,会直接返回一个空的UserInfo列表,不需要额外的空判断。
内容的提问来源于stack exchange,提问作者Srinivas Lakshman
相关产品推荐
相关产品推荐

