![](/img/trans.png)
[英]JAVA fill a temporary Arraylist with objects and then add it into a ArrayList which consists of arrayLists
[英]Java 8 streams : Combine properties of two objects which are in ArrayLists into an ArrayList of a third object type
我是Java 8流的新手,希望能对学习有所帮助。
我有一个User对象的Arraylist和UserCompany对象的Arraylist。 User对象具有user_id和关联的用户信息。UserCompany列表具有用户的Company对象,但仅具有User的user_id。 我想使用Java 8流创建一个名为UserCompanyView的第三个对象,该对象是User对象和Company对象的组合。 我只能找到两个被串联或合并的数组的示例,例如:
Stream.of(list1, list2)
.flatMap(x -> x.stream())
.collect(Collectors.toList());
但是没有使用单个列表的特定属性创建第三个对象的地方。
该代码应:
1)遍历UserCompany列表
2)检查UserCompany user_id是否与用户列表user_id相匹配
3)如果2为true,则使用User和UserCompany创建一个UserCompanyView对象
4)将UserCompanyView从3添加到新列表并返回它。
感谢您查看这篇文章并花时间回复
为了使其执行,首先要构建一个user_id
到User
对象的Map
。
使用流,您可以这样做:
List<User> users = // built elsewhere
Map<Integer, User> userById = users.stream()
.collect(Collectors.toMap(User::getUserId, u -> u));
然后,迭代和UserCompany
对象,查找User
对象,并创建UserCompanyView
对象,然后将它们添加到List
。
使用流,您可以这样做:
List<UserCompany> userCompanies = // built elsewhere
List<UserCompanyView> views = userCompanies.stream()
.map(uc -> new UserCompanyView(userById.get(uc.getUserId()), uc))
.collect(Collectors.toList());
如果他们没有遵循相同的顺序,则需要首先创建一个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())
如果存在UserCompany
而不匹配的User
,则可以通过在map()
之前添加以下内容来过滤掉它们:
.filter(uc -> usersById.containsKey(uc.getUserId()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.