相当于Java 7中的ComputeIfAbsent

时间:2016-11-15 16:53:04

标签: java android

只有在ConcurrentHashMap中不存在密钥时才能运行一段代码,并将代码的结果保存到集合中吗?

我无法使用 Java 8 功能,因为我正在为Android开发。

另外,如果我不需要,我想避免运行长操作,并且我不想破坏集合的原子操作。

2 个答案:

答案 0 :(得分:7)

没有确切的等价物,但通常的方法是这样的:

objectsDict.flatMap{$0.value.joined()}

这在功能上与Java 8中的ConcurrentMap<Key,Value> map = ... Value computeIfAbsent(Key k) { Value v = map.get(k); if (v == null) { Value vNew = new Value(...); // or whatever else you do to compute the value v = (v = map.putIfAbsent(k, vNew)) == null ? vNew : v; } return v; } 调用完全相同,唯一的区别在于有时你构造一个永远不会进入地图的computeIfAbsent对象 - 因为另一个线程将它放入第一。它永远不会导致返回错误的对象或类似的东西 - 无论如何,函数始终返回正确的Value,但如果Value的构造具有副作用 *,则可能不会是可以接受的。

额外的实例通常不是性能问题,因为初始Value检查会消除对get()的大多数调用。通常,这种方法可以比putIfAbsent明显更快,因为当对象已经存在时,该调用会对对象进行不必要的锁定。如果某些对象严重争用,我本地测量它的速度为

如果您真的需要集成到地图中的计算行为(内部锁定保持正好一个线程创建新对象),您可以使用Guava的joblib.dump获取computeIfAbsent。它与Java 8的CHM基本相同,但有大量额外的配置选项。

答案 1 :(得分:-1)

不。使其工作的方法是在地图上使用您自己的锁定。