Функция группировки Java 8 для возврата Map <String, Integer> вместо Map <String, Long> - PullRequest
2 голосов
/ 26 марта 2019

Я использую приведенный ниже код для определения количества раз каждого слова, которое встречается в строке.

Map<String, Long> map = Arrays.asList(text.split("\\s+")).stream().collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,Collectors.counting()))

этот код возвращает Map<String, Long> Я хочу преобразовать этот код в значение Map<String, Integer>.Я попытался сделать это, используя приведенный ниже код,

Но он выдает ClassCastException java.lang.Integer не может быть приведен к java.lang.Long

Map<String, Integer> map1 = 
 map.entrySet().parallelStream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> Integer.valueOf(entry.getValue())));

Пожалуйста, помогите мне решить эту проблему, янужно вернуть карту

Ответы [ 3 ]

4 голосов
/ 26 марта 2019

Вы можете выполнить преобразование Long в Integer после подсчета, например

Map<String, Integer> map = Arrays.stream(text.split("\\s+"))
    .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new,
        Collectors.collectingAndThen(Collectors.counting(), Long::intValue)));

, но вы также можете подсчитать, используя тип значения int, во-первых:

Map<String, Integer> map = Arrays.stream(text.split("\\s+"))
    .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new,
        Collectors.summingInt(word -> 1)));

Это сумма по одному для каждого слова.Вы можете использовать тот же подход с коллектором toMap:

Map<String, Integer> map = Arrays.stream(text.split("\\s+"))
    .collect(Collectors.toMap(Function.identity(), word -> 1, Integer::sum));
0 голосов
/ 26 марта 2019

Collectors.counting() - не более чем Collectors.reducing(0L, e -> 1L, Long::sum) ( источник ); используйте Collectors.reducing(0, e -> 1, Integer::sum) вместо этого, и вы будете установлены:

Map<String, Integer> map = Arrays.asList(text.split("\\s+")).stream().collect(Collectors.groupingBy(
    Function.identity(),
    LinkedHashMap::new,
    Collectors.reducing(0, e -> 1, Integer::sum)
));

Попробуйте здесь .

0 голосов
/ 26 марта 2019

Вы должны преобразовать long в целое число, вам нужно, чтобы значение было o.getValue().intValue()

Map<String, Integer> stringIntegerMap = 
stringLongMap.entrySet().stream().collect(toMap(Map.Entry::getKey, o -> 
o.getValue().intValue(), (a, b) -> b));

Существует способ, с помощью которого вы можете сначала преобразовать Map<String,Integer> в summingInt(x -> 1))

 Map<String, Integer> map = Arrays.asList(text.split("\\s+")).stream()
.collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,summingInt(value -> 1)));
...