java不完全清楚这段代码的作用是什么?(包括Set、HashMap和.keySet())
因此,我已经完成了一个项目,并得到了他人的帮助/与他人合作。除了一个部分外,我理解所有程序的每一行代码的功能。代码如下:
Set<String> set1 = firstWordGroup.getWordCountsMap().keySet();
Map<String, Integer> stringIntegerMap1 = set1.stream().collect(HashMap::new,
(hashMap, s) -> hashMap.put(s, s.length()), HashMap::putAll);
stringIntegerMap1.forEach((key,value) ->System.out.println(key + " : "+value));
一些背景信息:
getWordCut是一个如下所示的方法:
公共HashMap getWordCountsMap(){
HashMap<String, Integer> myHashMap = new HashMap<String, Integer>(); for (String word : this.getWordArray()) { if (myHashMap.keySet().contains(word)) { myHashMap.put(word, myHashMap.get(word) + 1); } else { myHashMap.put(word, 1); } } return myHashMap; }
firstWordGroup是一个存储字符串的构造函数
如果有人能准确地解释这段代码的作用以及它是如何实现的,那将非常有用,谢谢
附言:我不确定是否提供整个程序来复制代码是相关的,所以如果你认为是相关的,就留下一条评论说是这样,我会编辑这个问题,这样你就可以复制程序
# 1 楼答案
getWordScontsMap()返回一个映射,其中关键字是一个单词,值是该单词在数组中出现的次数
。keyset()方法只返回映射的键,所以现在您有了一组单词,但丢失了出现计数
这是使用Java8 streams来迭代最初放入映射中的集合(单词),并创建一个新的哈希映射,其中键是单词(与以前一样),值是单词的长度(而最初是单词计数)。创建并填充并返回一个新的哈希映射
我不理解的是最终的HashMap::putAll(),它似乎接受了刚刚填充的HashMap并重新添加了所有条目(这实际上是一个no-op,因为键将被替换)。因为我还没有快速打开IDE来放入代码并测试它(如果你自己没有,我会推荐这样做,因为这不是我的问题!)
本质上,这是一种更干净的方法,可以遍历创建的映射中的条目,打印出每个条目的单词和长度
在完成这项工作并思考之后,我有一种感觉,我正在为您做功课,解决这一问题的真正方法是通过IDE进行分解和调试,并查看每一步的功能
# 2 楼答案
此行调用
getWordCountsMap
,它返回从单词到其计数的映射。然后,它忽略计数,只将单词放在一个集合中。注意,这可以通过许多更简单的方法实现这会将单词集转换为流,然后收集流。收集器首先创建一个哈希映射,然后为每个单词添加一个从长度到长度的映射。如果创建了多个映射(在流中是允许的),则使用
putAll
组合它们。同样,有更简单、更清晰的方法来实现这一点此行遍历映射中的所有条目并打印出键和值
所有这些代码都可以通过以下方式实现:
此命令将单词转换为流,删除重复项,将单词映射到输出字符串,然后打印它们