簡體   English   中英

如何使用 Java 8 流獲取每個不同鍵的第一個值?

[英]How to get the first value for each distinct keys using Java 8 streams?

例如:我有一個包含電子郵件的用戶對象列表。 我想收集具有不同電子郵件的用戶列表(因為具有相同電子郵件的兩個用戶可能是同一個人,所以我不關心差異)。 換句話說,對於每個不同的鍵(電子郵件),我想獲取使用該鍵找到的第一個值(用戶)並忽略其余的值。

這是我想出的代碼:

public List<User> getUsersToInvite(List<User> users) {
    return users
            .stream()
            // group users by their e-mail
            // the resulting map structure: email -> [user]
            .collect(Collectors.groupingBy(User::getEmail, LinkedHashMap::new, Collectors.toList()))
            // browse each map entry
            .entrySet()
            .stream()
            // get the first user object for each entry
            .map(entry -> entry.getValue().get(0))
            // collect such first entries into a list
            .collect(Collectors.toList());
}

有沒有更優雅的方式?

您可以使用Collectors.toMap(keyMapper, valueMapper, mergeFunction) ,使用電子郵件作為鍵,用戶作為值並通過始終返回第一個值來忽略鍵沖突。 Map ,您可以通過調用values()來獲取用戶。

public List<User> getUsersToInvite(List<User> users) {
    return new ArrayList<>(users.stream()
                                .collect(Collectors.toMap(User::getEmail, 
                                                          Function.identity(), 
                                                          (u1, u2) -> u1))
                                .values());
}

暫無
暫無

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

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