Java 8で追加されたMap#computeIfAbsentの使用例について紹介します。
こんなコードはありませんか?
たとえば、Mapに要素を追加するaddStudentメソッドがあります。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SchoolEntity {
private final Map<String, List<String>> studentMap = new HashMap<>();
/**
* 学級に生徒を追加します
* @param classRoom 学級名
* @param studentName 生徒名
*/
public void addStudent(String classRoom, String studentName) {
List<String> studentList;
if (studentMap.containsKey(classRoom)) {
studentList = studentMap.get(classRoom);
} else {
studentList = new ArrayList<>();
}
studentList.add(studentName);
studentMap.put(classRoom, studentList);
}
}
上記のaddStudentメソッドのコードは、下記の流れで実装されています。
- Mapに指定のKey(classRoom)が存在するかを確認する
- 存在する場合は値要素(List)を取得する
- 存在しない場合は新規にArrayListインスタンスを作成し、取得する
- 取得したList要素に対して、引数で渡されたオブジェクト(studentName)を追加する
- 2番のListをMapにputする
やっていることは単純なのですが、ちょっと長いコードですね。
Map#computeIfAbsentを使うと
上記のaddStudentメソッドの実装を、たった1行で書くことができます。
public void addStudent(String classRoom, String studentName) {
studentMap.computeIfAbsent(classRoom, (key) -> new ArrayList<>()).add(studentName);
}
とても便利ですね。
SonarQubeでの検知
静的解析ツールであるSonarQubeでは、上記のようにMap#computeIfAbsentが利用できる可能性のあるコードを自動的に検知することができます。