我是Java 8 streams的新手,希望能对我的学习有所帮助。
我有一个用户对象的数组列表和一个UserCompany对象的数组列表。User对象有一个user_id和相关的用户信息,UserCompany列表有用户的Company对象,但只有用户的user_id。我想创建第三个名为UserCompanyView的对象,它是User对象和Company对象的组合,使用Java8 streams。我只能找到连接或合并两个数组的示例,例如:
Stream.of(list1, list2)
.flatMap(x -> x.stream())
.collect(Collectors.toList());
而不是使用各个列表的特定属性来创建第三个对象。
代码应该是:
1)遍历UserCompany列表
2)检查UserCompany user_id是否与用户列表user_id匹配
3)如果2为真,则使用用户和UserCompany创建一个UserCompanyView对象
4)将3中的UserCompanyView添加到新列表中并返回。
感谢你阅读这篇文章并花时间回复
发布于 2018-09-21 04:29:45
如果它们不遵循相同的顺序,则需要首先创建一个ID映射:
Map<Integer, User> usersById = users.stream()
.collect(Collectors.toMap(User::getUserId, u -> u));
现在,您可以流式传输另一个列表,并通过ID将每个元素映射到其匹配的User
:
List<UserCompanyView> views = userCompanies.stream()
.map(uc -> new UserCompanyView(usersById.get(uc.getUserId()), uc))
.collect(Collectors.toList())
如果存在不匹配User
的UserCompany
,则可以通过在map()
之前添加以下内容来过滤掉它们
.filter(uc -> usersById.containsKey(uc.getUserId()))
发布于 2018-09-21 04:28:47
为了让它执行,首先要构建一个user_id
to User
对象的Map
。
使用streams,你可以这样做:
List<User> users = // built elsewhere
Map<Integer, User> userById = users.stream()
.collect(Collectors.toMap(User::getUserId, u -> u));
然后迭代和UserCompany
对象,查找User
对象,创建UserCompanyView
对象,将它们添加到List
中。
使用streams,你可以这样做:
List<UserCompany> userCompanies = // built elsewhere
List<UserCompanyView> views = userCompanies.stream()
.map(uc -> new UserCompanyView(userById.get(uc.getUserId()), uc))
.collect(Collectors.toList());
https://stackoverflow.com/questions/52432643
复制相似问题