当我阅读API文档时,仅当映射中不存在(不存在)密钥时才调用映射函数,但是在下面Bloch的Effective Java 3ed p.225(略作修改)的代码中,似乎这里的方法依赖于映射函数lambda来填充TreeSet中的同一键上的多次匹配:
public class Anagrams {
public static void main(String[] args) throws IOException {
File dictionary = new File("C:\\tmp\\words.txt");
int minGroupSize = Integer.parseInt("3");
Map<String, Set<String>> groups = new HashMap<>();
try (Scanner s = new Scanner(dictionary)) {
while (s.hasNext()) {
String word = s.next();
groups.
computeIfAbsent
(alphabetize(word), (unused) -> new TreeSet<>())
.add(word);
}
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (Set<String> group : groups.values())
if (group.size() >= minGroupSize)
System.out.println(group.size() + ": " + group);
}
private static String alphabetize(String s) {
char[] a = s.toCharArray();
Arrays.sort(a);
return new String(a);
}
}
我想念什么?
答案 0 :(得分:0)
我不知道,这对我来说似乎很简单。那里发生的事情可以重写如下:
Map<String, Set<String>> groups = new HashMap<>();
...
Set<String> wordSet = groups.get(alphabetize(word));
if(wordSet == null) {
wordSet = new TreeSet<>();
groups.put(alphabetize(word), wordSet);
}
wordSet.add(word);
基本上,如果映射中已经存在该集合(通过alphabetize(word)
键找到),则将其返回。否则,它将创建。
答案 1 :(得分:0)
仅当键没有当前值时,computeIfAbsent
方法才会调用映射函数。调用映射函数时,返回的值将添加到映射中。
摘自Map.computerIfAbsent
的api文档:
如果指定的键尚未与值关联(或为 映射到
null
),尝试使用给定的映射来计算其值 函数,除非有null
,否则将其输入此地图。
在您的代码中,它要么返回一个现有集合,要么创建一个新的空集合(并将其添加到地图中)。然后将单词添加到computeIfAbsent
返回的集合中。