Во-первых, вы можете просто использовать логику отображения значений. Поскольку вы утверждаете , что слова, отличные от 4 слов, перечисленных в желаемом выводе, не могут произойти, вам просто нужно сопоставить любое числовое значение со словом "целое число":
groupingBy(s -> Character.isDigit(s.charAt(0)) ? "integer" : s, ...)
Во-вторых, нужно подсчитать пропущенные слова, но grouping()
не может придумать группы для пропущенных слов.
Проще всего было бы добавить недостающие группы по факту:
List.of("fizz", "buzz", "fizzbuzz", "lucky", "integer")
.forEach(s -> map.putIfAbsent(s, 0L));
Наконец, вы хотите, чтобы результат был разделен пробелом, используя :
между ключом и значением, поэтому вы не можете (ну, не должны) использовать Map.toString()
метод.
String input = "1 2 lucky 4 buzz fizz";
Map<String, Long> map = Pattern.compile(" ").splitAsStream(input)
.collect(groupingBy(s -> (Character.isDigit(s.charAt(0)) ? "integer" : s), counting()));
List.of("fizz", "buzz", "fizzbuzz", "lucky", "integer")
.forEach(s -> map.putIfAbsent(s, 0L));
String output = map.entrySet().stream()
.map(e -> e.getKey() + ": " + e.getValue())
.collect(Collectors.joining(" "));
System.out.println(output);
выход
lucky: 1 integer: 3 fizz: 1 fizzbuzz: 0 buzz: 1