Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将字符串列表收集到映射中,其中每个字符串都是一个键?_Java_Java Stream_Java 11_Collectors - Fatal编程技术网

Java 如何将字符串列表收集到映射中,其中每个字符串都是一个键?

Java 如何将字符串列表收集到映射中,其中每个字符串都是一个键?,java,java-stream,java-11,collectors,Java,Java Stream,Java 11,Collectors,我正在做一个练习,数一数短语中的单词 我有一个我很喜欢的正则表达式,可以将短语分割成单词标记,这样我就可以用基本循环完成这项工作——没问题 但是我希望使用流将字符串收集到映射中,而不是使用基本循环 我需要每个单词作为键,现在,我只希望整数1作为值。 在网上做了一些研究后,我应该能够将单词列表收集到一张地图中,如下所示: public Map<String, Integer> phrase(String phrase) { List<String> words =

我正在做一个练习,数一数短语中的单词

我有一个我很喜欢的正则表达式,可以将短语分割成单词标记,这样我就可以用基本循环完成这项工作——没问题

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

我需要每个单词作为键,现在,我只希望整数
1
作为值。 在网上做了一些研究后,我应该能够将单词列表收集到一张地图中,如下所示:

public Map<String, Integer> phrase(String phrase) {
    List<String> words = //... tokenized words from phrase
    return words.stream().collect(Collectors.toMap(word -> word, 1));
}
到目前为止,我发现的任何示例都只使用字符串作为值,但在其他方面表明这应该是可以的


我需要更改什么才能使其正常工作?

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

return words.stream().collect(Collectors.toMap(word -> word, word -> 1));
但是,这将导致
映射的所有值都为1,如果
单词中有重复的元素,则会出现异常

您需要使用带有合并函数的
收集器.groupingBy
收集器.toMap
来处理重复值

比如说

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


使用
word->1
而不仅仅是
1
,因为需要一个函数。
return words.stream().collect(Collectors.groupingBy(word -> word, Collectors.counting()));
return words.stream().collect(Collectors.toMap(word -> word, word -> 1, Integer::sum));