编程语言
首页 > 编程语言> > 如何使用Java 8流获得每个不同键的第一个值?

如何使用Java 8流获得每个不同键的第一个值?

作者:互联网

例如:我有一个带有电子邮件的用户对象列表.我想收集具有不同电子邮件的用户列表(因为使用同一电子邮件的两个用户可能是同一个人,因此我不在乎这些差异).换句话说,对于每个不同的键(电子邮件),我想获取通过该键找到的第一个值(用户),而忽略其余的值.

这是我想出的代码:

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),将电子邮件用作键,将用户用作值,并通过始终返回第一个值来忽略键冲突.在地图上,您可以通过致电values()获取用户.

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

标签:java-8,java-stream,email,java
来源: https://codeday.me/bug/20191119/2037529.html