![](/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.