在HashMap上添加到列表值

Fun*_*hor 7 java hashmap null-check

我正在填充一个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);
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来编码?

myHashMap.addToValueListOrCreateValueList(myObject);
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 8

在Java 8中,您的整个代码可以像这样编写(如提出的其他精细答案):

Map<Integer, List<Person>> myHashMap = new HashMap();

for (Person person : persons) {
   myHashMap.computeIfAbsent(age,age->new ArrayList<Person>()).add(person);
}
Run Code Online (Sandbox Code Playgroud)

但是,你可能会更通过收集成一个流短MapCollectors.groupingBy():

Map<Integer, List<Person>> myMap = persons.stream().collect(Collectors.groupingBy(Person:getAge));
Run Code Online (Sandbox Code Playgroud)

作为旁注,您的实际Java 7代码也可以得到改进.当然,没有Java 8那么多,但如果你不能使用Java 8,这可能会很有趣.
在您的实际代码中,这是重复的:

personsOfSameAge.add(person);
Run Code Online (Sandbox Code Playgroud)

并且您使用两个条件语句(ifelse),而只有if在您首先处理特殊情况时才足够:没有值Map.
这是一个修改版本:

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);                
}
Run Code Online (Sandbox Code Playgroud)

  • Java8 万岁! (2认同)

Era*_*ran 7

是的,Java 8中有:

List<Person> personsOfSameAge = myHashMap.computeIfAbsent(age,age->new ArrayList<Person>());
personsOfSameAge.add(person);
Run Code Online (Sandbox Code Playgroud)

要不就

myHashMap.computeIfAbsent(age,age->new ArrayList<Person>()).add(person);
Run Code Online (Sandbox Code Playgroud)