java - 在 HashMap 中添加到 List 的快捷方式

标签 java collections hashmap

我经常需要获取对象列表并根据对象中包含的值将它们分组到 Map 中。例如。按国家/地区列出用户和组。

我的代码通常如下所示:

Map<String, List<User>> usersByCountry = new HashMap<String, List<User>>();
for(User user : listOfUsers) {
    if(usersByCountry.containsKey(user.getCountry())) {
        //Add to existing list
        usersByCountry.get(user.getCountry()).add(user);

    } else {
        //Create new list
        List<User> users = new ArrayList<User>(1);
        users.add(user);
        usersByCountry.put(user.getCountry(), users);
    }
}

但是我不禁认为这很尴尬,有些大师有更好的方法。到目前为止我能看到的最接近的是 MultiMap from Google Collections .

有没有标准的方法?

谢谢!

最佳答案

从 Java 8 开始,您可以使用 Map#computeIfAbsent() .

Map<String, List<User>> usersByCountry = new HashMap<>();

for (User user : listOfUsers) {
    usersByCountry.computeIfAbsent(user.getCountry(), k -> new ArrayList<>()).add(user);
}

或者,使用 Stream API 的 Collectors#groupingBy()直接从 ListMap:

Map<String, List<User>> usersByCountry = listOfUsers.stream().collect(Collectors.groupingBy(User::getCountry));

在 Java 7 或更低版本中,你能得到的最好的结果如下:

Map<String, List<User>> usersByCountry = new HashMap<>();

for (User user : listOfUsers) {
    List<User> users = usersByCountry.get(user.getCountry());
    if (users == null) {
        users = new ArrayList<>();
        usersByCountry.put(user.getCountry(), users);
    }
    users.add(user);
}

Commons Collections有一个 LazyMap ,但它没有参数化。 Guava没有 LazyMapLazyList,但你可以使用 Multimapanswer of polygenelubricants below所示.

关于java - 在 HashMap 中添加到 List 的快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3019376/

相关文章:

java - 关于线程中止和死锁的问题 - volatile 关键字

java - JMockit 问题(刚开始)

java - 如何配置 Spring AOP 以使用 AspectJ

java - 在使用集合时使用其父类(super class)创建子类对象的原因是什么?

java - List.of 给出编译错误 "The method of(char, char, char, char, char, char) is undefined for the type List"

在 2 个键上索引的 Java HashMap

java - 如何解决此问题 : Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

java - HashSet 的条目在迭代时给出 ConcurrentModificationException

C++ 模板化 HashMap 实现错误

java - 在Java中将元素添加到HashMap的ArrayList中的HashMap