我经常需要获取对象列表并根据对象中包含的值将它们分组到 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);
}
}
但是我不禁认为这很尴尬,一些大师有更好的方法。到目前为止,我能看到的最接近的是 Google Collections 中的 MultiMap 。
有没有标准的方法?
谢谢!
原文由 Damo 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 Java 8 开始,您可以使用
Map#computeIfAbsent()
。或者,直接使用 Stream API 的
Collectors#groupingBy()
从List
到Map
:在 Java 7 或更低版本中,你能得到的最好的结果如下:
Commons Collections 有一个
LazyMap
,但它没有参数化。 Guava 没有LazyMap
或LazyList
,但您可以使用Multimap
,如 下面的 polygenelubricants 的回答所示。