Вычисление значения в карте в Java
Интерфейс Map с Java 8 получил методы, которые
сами проверяют наличие ключа и считают новое значение.
Так меньше шаблонного кода с containsKey,
get и повторным put.
Метод computeIfAbsent добавляет значение только
если ключа еще нет. computeIfPresent меняет
запись, когда ключ найден. compute вызывает
функцию в любом случае и может вернуть null,
чтобы удалить пару.
Подсчет частот символов в слове:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Character, Integer> freq = new HashMap<>();
for (char ch : "aba".toCharArray()) {
freq.compute(ch, (key, old) -> old == null ? 1 : old + 1);
}
System.out.println(freq);
}
}
Лямбда получает ключ и старое значение (или
null). Для группировки списков по ключу
удобен computeIfAbsent с фабрикой пустого
списка:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, List<Integer>> groups = new HashMap<>();
groups.computeIfAbsent("a", k -> new ArrayList<>()).add(1);
groups.computeIfAbsent("a", k -> new ArrayList<>()).add(2);
System.out.println(groups.get("a"));
}
}
Второй вызов не создает новый список: ключ уже есть, возвращается существующий объект.
Посчитайте, сколько раз встречается каждая буква
в слове "java" или compute, и
выведите карту.