如何在Java8中替换以下代码? private void createAnagramSignatures(){ for(字符串字:dictionary.keySet()){ int签名=getSignature(word); 如果(!anagramMap.containsKey(签名)){ anagramMap.put(签名,新ArrayList()); } anagramMap.get(签名).add(单词); } }

如何在Java8中替换以下代码? private void createAnagramSignatures(){ for(字符串字:dictionary.keySet()){ int签名=getSignature(word); 如果(!anagramMap.containsKey(签名)){ anagramMap.put(签名,新ArrayList()); } anagramMap.get(签名).add(单词); } },java,dictionary,java-8,Java,Dictionary,Java 8,我对map.getOrDefault有点熟悉,只是不确定如何在以下场景中应用它。一种方法是使用computeIfAbsent,您可以按如下方式执行: private void createAnagramSignatures() { for (String word : dictionary.keySet()) { int signature = getSignature(word); if (!anagramMap.containsKey(signatur

我对map.getOrDefault有点熟悉,只是不确定如何在以下场景中应用它。

一种方法是使用
computeIfAbsent
,您可以按如下方式执行:

private void createAnagramSignatures() {
    for (String word : dictionary.keySet()) {
        int signature = getSignature(word);
        if (!anagramMap.containsKey(signature)) {
            anagramMap.put(signature, new ArrayList<String>());
        }
        anagramMap.get(signature).add(word);
    }
}
dictionary.keySet()
.forEach(word->anagramMap.computeIfAbsent(getSignature(word)),
关键字->新建ArrayList()).add(word));

您可以尝试用流替换增强的for循环,但老实说,我宁愿阅读并维护您当前的版本。顺便说一句,在初始化地图中的列表时可能会出现一些奇怪的逻辑。这个答案与Tim Biegeleisen所说的类似。有些东西不应该重构为lambda表达式。我发现上面的内容更容易阅读和理解。@kaba713良好的可读性可能是基于观点的。对我来说(我的观点),API只是大声读出,
computeifassent
,而另一方面,OP代码中的
if
add
位也执行相同的操作。
dictionary.keySet()
        .forEach(word -> anagramMap.computeIfAbsent(getSignature(word),
                key -> new ArrayList<>()).add(word));