К сожалению, не однострочный, но он делает свое волшебство и также более читабелен (недостаток: он создает новый HashSet<>()
каждый раз)
m.putIfAbsent(key, new HashSet<>());
// Solution 1 :
m.compute(key, (k, v) -> {v.add(v.size() + 1); return v;});
// Solution 2 :
Set<Integer> s = m.get(key);
s.add(s.size() + 1);
Или как предложено @Thilo и вдохновлено @ Eran
m.computeIfAbsent(key, k -> new HashSet<>()).add(m.get(key).size() + 1);
Один вкладыш возможен, потому что он возвращает значение, рассчитанное им, как указано в javadoc
Если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), попытается вычислить его значение, используя заданную функцию сопоставления, и вводит его в эту карту, если только не NULL.
Существует даже аналогичный пример в javadoc
map.computeIfAbsent (ключ, k -> новый HashSet ()). Add (v);
Небольшой компромисс лайнера - дополнительный вызов m.get(key)
, который не происходит с решением @ Eran