添加到 HashMap 上的列表值
Add to List value on HashMap
我正在填充一个散列图,让我的对象按其属性之一分组。
我发现在将我的对象添加到列表(值)之前检查列表(值)是否存在是“丑陋的”。
一个例子会更明确:
// Need a map to group Person by age.
// Person = {age: int}
Map<Integer, List<Person>> myHashMap = new HashMap();
for (Person person : persons) {
int age = person.getAge();
List<Person> personsOfSameAge = myHashMap.get(age);
if (personsOfSameAge != null) {
personsOfSameAge.add(person);
} else {
personsOfSameAge = new ArrayList();
personsOfSameAge.add(person);
myHashMap.put(age, personsOfSameAge);
}
}
有没有更好的编码方式?
myHashMap.addToValueListOrCreateValueList(myObject);
是的,在Java 8:
List<Person> personsOfSameAge = myHashMap.computeIfAbsent(age,age->new ArrayList<Person>());
personsOfSameAge.add(person);
或者只是
myHashMap.computeIfAbsent(age,age->new ArrayList<Person>()).add(person);
是这样的吗?
List<Person> newList = Optional.ofNullable( myHashMap.get(age)).orElse(new ArrayList<>());
newList.add(person);
myHashMap.put(age, newList);
在 Java 8 中,你的整个代码可以这样写(正如其他提出的很好的答案):
Map<Integer, List<Person>> myHashMap = new HashMap();
for (Person person : persons) {
myHashMap.computeIfAbsent(age,age->new ArrayList<Person>()).add(person);
}
但是你可以通过使用收集到 Map
和 Collectors.groupingBy()
的流来更短:
Map<Integer, List<Person>> myMap = persons.stream().collect(Collectors.groupingBy(Person:getAge));
附带说明一下,您的实际 Java 7 代码也可以改进。
当然,不如 Java 8 多,但如果你不能使用 Java 8,这可能很有趣。
在您的实际代码中,这是重复的:
personsOfSameAge.add(person);
并且您使用了两个条件语句(if
和 else
),而如果您首先处理特殊情况,则仅 if
就足够了:[=14= 中没有值].
这是修改后的版本:
Map<Integer, List<Person>> myHashMap = new HashMap<>();
for (Person person : persons) {
int age = person.getAge();
List<Person> personsOfSameAge = myHashMap.get(age);
if (personsOfSameAge == null) {
personsOfSameAge = new ArrayList();
myHashMap.put(age, personsOfSameAge);
}
personsOfSameAge.add(person);
}
尽管问题涉及在 Java 8 中进行,但我将其作为替代方式发布。
您可以使用 MultiMap from Google Guava.
Multimap<String, Person> myHashMap = ArrayListMultimap.create();
for (Person person : persons) {
myHashMap.put(person.getAge(), person);
}
但是,您必须注意一个区别:Java 的映射 returns null
用于不存在的键,而 Google Guava 的 MultiMap returns一个empty List
.
来自 javadoc for get(key) of MultiMap
Returns a view collection of the values associated with key in this multimap, if any. Note that when containsKey(key) is false, this returns an empty collection, not null.
Changes to the returned collection will update the underlying multimap, and vice versa
我正在填充一个散列图,让我的对象按其属性之一分组。 我发现在将我的对象添加到列表(值)之前检查列表(值)是否存在是“丑陋的”。
一个例子会更明确:
// Need a map to group Person by age.
// Person = {age: int}
Map<Integer, List<Person>> myHashMap = new HashMap();
for (Person person : persons) {
int age = person.getAge();
List<Person> personsOfSameAge = myHashMap.get(age);
if (personsOfSameAge != null) {
personsOfSameAge.add(person);
} else {
personsOfSameAge = new ArrayList();
personsOfSameAge.add(person);
myHashMap.put(age, personsOfSameAge);
}
}
有没有更好的编码方式?
myHashMap.addToValueListOrCreateValueList(myObject);
是的,在Java 8:
List<Person> personsOfSameAge = myHashMap.computeIfAbsent(age,age->new ArrayList<Person>());
personsOfSameAge.add(person);
或者只是
myHashMap.computeIfAbsent(age,age->new ArrayList<Person>()).add(person);
是这样的吗?
List<Person> newList = Optional.ofNullable( myHashMap.get(age)).orElse(new ArrayList<>());
newList.add(person);
myHashMap.put(age, newList);
在 Java 8 中,你的整个代码可以这样写(正如其他提出的很好的答案):
Map<Integer, List<Person>> myHashMap = new HashMap();
for (Person person : persons) {
myHashMap.computeIfAbsent(age,age->new ArrayList<Person>()).add(person);
}
但是你可以通过使用收集到 Map
和 Collectors.groupingBy()
的流来更短:
Map<Integer, List<Person>> myMap = persons.stream().collect(Collectors.groupingBy(Person:getAge));
附带说明一下,您的实际 Java 7 代码也可以改进。
当然,不如 Java 8 多,但如果你不能使用 Java 8,这可能很有趣。
在您的实际代码中,这是重复的:
personsOfSameAge.add(person);
并且您使用了两个条件语句(if
和 else
),而如果您首先处理特殊情况,则仅 if
就足够了:[=14= 中没有值].
这是修改后的版本:
Map<Integer, List<Person>> myHashMap = new HashMap<>();
for (Person person : persons) {
int age = person.getAge();
List<Person> personsOfSameAge = myHashMap.get(age);
if (personsOfSameAge == null) {
personsOfSameAge = new ArrayList();
myHashMap.put(age, personsOfSameAge);
}
personsOfSameAge.add(person);
}
尽管问题涉及在 Java 8 中进行,但我将其作为替代方式发布。
您可以使用 MultiMap from Google Guava.
Multimap<String, Person> myHashMap = ArrayListMultimap.create();
for (Person person : persons) {
myHashMap.put(person.getAge(), person);
}
但是,您必须注意一个区别:Java 的映射 returns null
用于不存在的键,而 Google Guava 的 MultiMap returns一个empty List
.
来自 javadoc for get(key) of MultiMap
Returns a view collection of the values associated with key in this multimap, if any. Note that when containsKey(key) is false, this returns an empty collection, not null. Changes to the returned collection will update the underlying multimap, and vice versa