- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Java8 引入了那些不错的方法 getOrDefault()
和 putIfAbsent()
,允许编写如下代码:
Map<Foo, List<Bar>> itemsByFoo = ...
List<Bar> bars = itemsByFoo.getOrDefault(key, new ArrayList<>());
bars.add(someNewBar);
现在我想知道是否有充分的事实理由:
itemsByFoo.put(key, bars);
或
itemsByFoo.putIfAbsent(key, bars);
两者都可以:
那么:“总是”选择选项 1 或选项 2 的充分理由是什么?
最佳答案
getOrDefault
适用于在不修改 map 的情况下使用缺失值的替代方法。如果您想为缺少的键添加一个新值,您可以在一次操作中完成。
List<Bar> bars = itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>());
bars.add(someNewBar);
甚至
itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>()).add(someNewBar);
在最好的情况下,当被 Map
实现覆盖时,就像 HashMap
一样,这将只进行一次散列查找。
并不是说 putIfAbsent
在使用 default
实现时只进行两次查找,当然,大多数 Map
实现将提供一次查找它的实现。尽管如此,getOrDefault
和 putIfAbsent
的组合在最好的情况下仍会进行两次查找,而优化的 computeIfAbsent
只进行一次。
关于java - 我应该在使用 getOrDefault() 之后使用 put() 还是 putIfAbsent()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459014/
getOrDefault 是 java.util.Map 的默认方法,已在 Java 8 中引入。getOrDefault 方法返回给定键的值,如果没有与该键关联的值,则指定的默认值为回来。找到方法签
我想在从一个页面重定向到另一个页面时获取 flashAttribute 并将其设置为模型。我尝试使用这段代码: Map map = RequestContextUtils.getInputFlashM
Java 的 getOrDefault 是一个很好的构造,用于单行访问 map 值或起点(如果不存在)。我在 C++ 中的 map 引用中没有看到任何带有并行的东西。有什么东西存在还是它是你自己的?
像这样尝试获取 Map 的 getOrDefault: String test = map.getOrDefault("test", "") 但它给了我一个错误“必需的?但有一个字符串”。无论如何要解
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
如果我在文本框页面中提供一些值,那么我会得到正确的输出,但如果我没有在文本框中提供任何值,我希望它将打印默认值。 为此,我使用 Map 类的 getOrDefault() 方法,但仍然没有获得默认值。
List list = hmap.getOrDefault(key,new ArrayList()); list.add(s); hmap.put(key,list); 为什么我需要再次使用hmap.
我有一个带有以下签名的 map (某种多 map ): Map> motherChildIndex; 如果映射中不存在该键,我希望它返回一个空集(而不是 null),因此我偶然发现了 getOrDef
是否有更简洁的方法来检查特定索引处是否存在值,例如 list.getOrDefault(index, "defaultValue") .或者甚至在特定索引超出列表范围时执行默认操作。 执行此操作的正常
我有一个 Map> someMap我正在检索基于 someKey 的值对于 SomeClass 列表的每个元素,我正在执行其他操作。 someMap.getOrDefault(someKey, new
我正在编写一个 Android 应用程序,我正在使用一个 Java 类,该类具有如下循环: for (Set itemset : candidateList2) { supportCountM
我注意到,如果我执行 map.getOrDefault("key1", new Object()),即使 map 中的 key1 存在对象,new Object() 已创建。虽然它不是由该方法返回的,
Java8 引入了那些不错的方法 getOrDefault() 和 putIfAbsent(),允许编写如下代码: Map> itemsByFoo = ... List bars = itemsByF
我有一个 HashMap : HashMap hmap = new HashMap<>(); 我想增加 HashMap 值的地方。为了避免nullPointer Exception如果 key 不存在
我有一个>的映射,我想做的是,如果列表存在,则添加一个字符串到映射值,否则创建一个列表并将其添加到列表中,然后插入到 map 中。s1、s2 是字符串。 代码: Map> map = new Hash
在下面的代码中,我在返回 namespaceMap 时遇到错误。不知道为什么。 getOrDefault 方法应在 HashMap.class 中定义。我尝试按照链接示例中的描述创建一个 Namesp
我在 Android 5.0 的魅族设备上发生崩溃。大多数设备上不会出现此崩溃。 错误是:java.lang.NoSuchMethodError:没有接口(interface)方法 getOrDefa
我是一名优秀的程序员,十分优秀!