Since Java 8 you can make use of Map#computeIfAbsent()
.
Map<String, List<User>> usersByCountry = new HashMap<>();
for (User user : listOfUsers) {
usersByCountry.computeIfAbsent(user.getCountry(), k -> new ArrayList<>()).add(user);
}
Or, make use of Stream API’s Collectors#groupingBy()
to go from List
to Map
directly:
Map<String, List<User>> usersByCountry = listOfUsers.stream().collect(Collectors.groupingBy(User::getCountry));
In Java 7 or below, best what you can get is below:
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 has a LazyMap
, but it’s not parameterized. Guava doesn’t have sort of a LazyMap
or LazyList
, but you can use Multimap
for this as shown in answer of polygenelubricants below.