总是调用Map.computeIfAbsent()映射函数吗?

时间:2019-07-16 18:48:23

标签: java dictionary lambda

当我阅读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);
    }
}

我想念什么?

2 个答案:

答案 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返回的集合中。