Dam*_*amo 52 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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不禁想到这很尴尬,而且一些大师有更好的方法.到目前为止,我能看到的最接近的是来自Google Collections的MultiMap.
有没有标准方法?
谢谢!
Bal*_*usC 71
在Java 8中,您可以使用Map#computeIfAbsent()
.
Map<String, List<User>> usersByCountry = new HashMap<>();
for (User user : listOfUsers) {
usersByCountry.computeIfAbsent(user.getCountry(), k -> new ArrayList<>()).add(user);
}
Run Code Online (Sandbox Code Playgroud)
或者,使用Stream API 来直接Collectors#groupingBy()
转到:List
Map
Map<String, List<User>> usersByCountry = listOfUsers.stream().collect(Collectors.groupingBy(User::getCountry));
Run Code Online (Sandbox Code Playgroud)
在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);
}
Run Code Online (Sandbox Code Playgroud)
Commons Collections有一个LazyMap
,但它没有参数化.番石榴没有一种LazyMap
或者LazyList
,但你可以使用Multimap
它,如下面的多基因润滑剂的回答所示.
pol*_*nts 20
Guava Multimap
确实是最合适的数据结构,实际上,有一种Multimaps.index(Iterable<V>, Function<? super V,K>)
实用方法可以完全按照你想要的方式执行:获取Iterable<V>
(a List<V>
是),并应用它Function<? super V, K>
来获取密钥Multimap<K,V>
.
以下是文档中的示例:
例如,
Run Code Online (Sandbox Code Playgroud)List<String> badGuys = Arrays.asList("Inky", "Blinky", "Pinky", "Pinky", "Clyde"); Function<String, Integer> stringLengthFunction = ...; Multimap<Integer, String> index = Multimaps.index(badGuys, stringLengthFunction); System.out.println(index);
版画
Run Code Online (Sandbox Code Playgroud){4=[Inky], 5=[Pinky, Pinky, Clyde], 6=[Blinky]}
在你的情况下,你会写一个Function<User,String> userCountryFunction = ...
.
归档时间: |
|
查看次数: |
73707 次 |
最近记录: |