簡體   English   中英

基於java 8中的匹配屬性比較兩個不同對象類型的列表

[英]Compare two Lists of different object types based on matching property in java 8

我有兩個類型的列表:

class User {
    Long userId;
    String userName;
    Long workflowStatusId;
}

class WorkflowStatus {
    Long workflowStatusId;
    String workflowStatusName;
    Long userId;
}

每個用戶對象都有 workflowStatusId。 同樣,每個 WorkflowStatus 都有與之關聯的 userId。 我首先保存User ,這給了我List<User> users ,其中每個對象的workflowStatusId設置為 null 。 現在,對於用戶中的每個用戶,我正在WorkflowStatus中創建新條目,這給了我List<WorkflowStatus> workflowStatuses 現在我想在我之前保存的User對象中設置這些新插入的workflowStatusId ,所以我試圖在兩者中匹配userId屬性,並希望在找到匹配項后設置這個workflowStatusId 我正在嘗試做類似的事情:

List<User> filteredList = users
                                            .stream()
                                             .filter(user -> workflowStatuses
                                                                .stream()
                                                                .allMatch(user.getUserId().equals(workflowStatus.getUserId())))
                                                                .map(how to set workflowStatusId in user? can i do something like user->user.setWorkflowStatusId((workflowStatus.getWorkflowStatusId)))
                                            .collect(Collectors.toList()); 

嘗試找到一些解決方案,如果可以使用Java 8 streams 基於java 8中的一些共同屬性比較不同對象類型的兩個列表的更好方法是什么?

在 Stream 中間設置屬性等副作用不是一個好主意。 更好的解決方案是只創建用戶實例的 Map:

Map<Long, User> usersById =
    users.stream().collect(Collectors.toMap(User::getUserId, u -> u));

現在您可以簡單地遍歷您的 WorkflowStatus 對象:

for (WorkflowStatus status : workflowStatuses) {
    Long userId = status.getUserId();
    Long statusId = status.getWorkflowStatusId();
    usersById.get(userId).setWorkflowStatusId(statusId);
}
<User> filteredList = users.stream().filter(user -> workflowStatuses
                                                            .stream()
                                                            .allMatch(user.getUserId().equals(workflowStatus.getWorkflowStatusId)))
                                                            .map(how to set workflowStatusId in user? can i do something like user->user.setWorkflowStatusId((workflowStatus.getWorkflowStatusId)))
                                        .collect(Collectors.toList());

在此生成 java 8 上的 Lamba 表達式循環

workflowStatus.foreach( data ) -> { user.setworkflowStatusId(data.getWorkflowStatusId);user.setuserId(data.getuserId);}

或在下面簡單替換

<User> filteredList = users.stream().filter(user -> workflowStatuses
                                                        .stream()
                                                        .allMatch(user.getUserId().equals(workflowStatus.getWorkflowStatusId)))
                                                        .map(workflowStatus.foreach( data ) -> { user.setworkflowStatusId(data.getWorkflowStatusId);user.setuserId(data.getuserId)})
                                    .collect(Collectors.toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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