簡體   English   中英

Java 8流:將ArrayLists中的兩個對象的屬性組合為第三種對象類型的ArrayList

[英]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_idUser對象的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM