scala 一种从ConcurrentHashMap中获取前一个值和新值的函数式方法

zf9nrax1  于 5个月前  发布在  Scala
关注(0)|答案(2)|浏览(77)

我需要从Java ConcurrentHashMap(在Scala代码中)中获取先前值和新值。为了保持线程安全,我使用compute块,它只返回新值。是否可以在不使用初始值为null的var的情况下同时获取新值和先前值?下面是我目前的解决方案:

map: ConcurrentHashMap[String, Object] = new ConcurrentHashMap

  def foo = {
    var previousValue: Object = null

    val newValue = map.compute("key", (_, value) => {
      previousValue = Option(value).getOrElse(initialValue)
      setNewValue(previousValue)
     }
    )

    (previousValue, newValue)
  }

字符串

waxmsbnn

waxmsbnn1#

不可以。当前版本的ConcurrentHashMap无法执行此操作。

wb1gzix0

wb1gzix02#

  • "...我需要从Java ConcurrentHashMap(Scala代码)中获取以前的值和新的值。..."*

这是一个用 Java 编写的解决方案,你可以移植。
一种有点不现代的方法;用 * ListIterator * 遍历 key-set

Map<String, Integer> m = new HashMap<>() {{
    put("A", 1);
    put("B", 2);
    put("C", 3);
    put("D", 4);
    put("E", 5);
}};
List<String> l = new ArrayList<>(m.keySet());
ListIterator<String> i = l.listIterator();
String x, y = i.next();
while (i.hasNext()) {
    x = i.next();
    System.out.printf("x = {'%s': %s}, ", x, m.get(x));
    System.out.printf("y = {'%s': %s}%n", y, m.get(y));
    if (i.hasNext()) y = x;
}

个字符

相关问题