如何收集地图的字符串列表,其中每个字符串都是一个键? [重复]

问题描述 投票:-2回答:1

我正在进行一项练习来计算短语中的单词。

我有一个正则表达式我很高兴把这个短语分成单词标记,所以我可以用基本循环完成工作 - 没问题。

但是我想使用流来将字符串收集到地图中而不是使用基本循环。

我需要每个单词作为键,现在,我只想将整数1作为值。在线完成一些研究后,我应该可以将字词列表收集到地图中,如下所示:

public Map<String, Integer> phrase(String phrase) {
    List<String> words = //... tokenized words from phrase
    return words.stream().collect(Collectors.toMap(word -> word, 1));
}

我尝试了这个,以及几个变种(使用word施放Function.identity()),但不断收到错误:

The method toMap(Function<? super T,? extends K>, Function<? super T,? extends U>) in the type Collectors is not applicable for the arguments ((<no type> s) -> {}, int)

我发现的任何一个例子只使用字符串作为值,否则表明这应该没问题。

为了使这项工作,我需要改变什么?

java java-stream java-11 collectors
1个回答
4
投票

要克服编译错误,您需要:

return words.stream().collect(Collectors.toMap(word -> word, word -> 1));

但是,这会导致Map的所有值都为1,如果你在words中有重复的元素,你将得到一个例外。

您需要使用带有合并功能的Collectors.groupingByCollectors.toMap来处理重复值。

例如

return words.stream().collect(Collectors.groupingBy(word -> word, Collectors.counting()));

要么

return words.stream().collect(Collectors.toMap(word -> word, word -> 1, Integer::sum));
© www.soinside.com 2019 - 2024. All rights reserved.