如何收集字符串列表到地图,其中每个字符串都是键?

时间:2019-04-14 12:30:21

标签: java java-stream java-11 collectors

我正在做一个练习来计算短语中的单词。

我很高兴使用正则表达式将短语拆分成单词标记,因此我可以使用基本循环来完成工作-没问题。

但是我想使用流将字符串收集到映射中,而不是使用基本循环。

我需要每个单词作为 key ,现在,我只想将整数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)

到目前为止,我发现的任何示例都只使用字符串作为值,否则表示应该没问题。

要进行这项工作,我需要更改什么?

1 个答案:

答案 0 :(得分: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));