Можно начать с малого, если боитесь стримов. Скажем, такой фрагмент кода на Java7:
Map<String, List<Item>> items = new HashMap<>();
public void addItem(String key, Item item) {
List<Item> list = items.get(key);
if(list == null) {
list = new ArrayList<>();
items.put(key, list);
}
list.add(item);
}
Нечто подобное встречается очень часто. В Java 8 это выглядит так:
Map<String, List<Item>> items = new HashMap<>();
public void addItem(String key, Item item) {
items.computeIfAbsent(key, k -> new ArrayList<>()).add(item);
}
Не только короче, но и быстрее, потому что ключ ищется один раз, а не два в случае вставки. Если же у вас ConcurrentMap, то правильный алгоритм вычисления несуществующего ключа, который бы минимально блокировал мэпку и при этом выполнялся не более одного раза, раньше написать было вообще нетривиально. А теперь так же, в одну строчку.