Как написать String Iteration с помощью операций Map Put в Java 8? - PullRequest
3 голосов
/ 18 апреля 2019

Я пытаюсь преобразовать следующий код в Java 8 ::

String s = "12345";
Map<Character,Integer> map = new HashMap<Character,Integer>();
for (int i = 0; i < s.length(); i++) {
 char c = s.charAt(i);
 if (map.containsKey(c)) {
   int cnt = map.get(c);
   map.put(c, ++cnt);
 } else {
   map.put(c, 1);
 }
}

Я попытался найти следующий способ итерации:

IntStream.rangeClosed(0, s.length).foreach(d -> {
      //all statements from char to map.put
}) ;

Я не уверен, что это правильный способ сделать это.

Ответы [ 2 ]

7 голосов
/ 18 апреля 2019

Вы можете сделать это:

s.chars()
  .mapToObj(x -> (char) x)
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  • .mapToObj(x -> (char) x) необходимо, потому что .chars() дает вам поток целых чисел, но для использования groupingBy вам нужно работать с объектами, а не с примитивами
  • groupingBy получает функцию для получения ключа для группировки и реализацию Collector
  • Function.identity() - это просто функция, которая возвращает любой элемент, который ей передан
  • Collectors.counting() - это коллектор, который считает
1 голос
/ 18 апреля 2019

Вы можете использовать коллекторы groupingBy() и counting():

String s = "12345";

Map<Character, Long> map = s
        .chars()
        .mapToObj(i -> (char) i)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

System.out.println(map);

К сожалению, кажется, нет удобного способа получить Stream<Character> из строки, следовательно, необходимо отобразить на IntStream, используя chars(), а затем используя mapToObj(), чтобы преобразовать его в символьный поток.

...