scala - 如何在 Scala 中使用 ConcurrentHashMap computeIfAbsent()

标签 scala concurrenthashmap

我正在使用 ConcurrentHashMap在 Scala 中,我想使用 computeIfAbsent()方法,但无法弄清楚第二个参数的语法。有人可以告诉我什么是正确的语法吗?

运行以下代码时

val data = new ConcurrentHashMap[String, LongAdder]

data.computeIfAbsent("bob", k: String => new LongAdder()).increment()

我收到以下错误
Type mismatch, expected: Function[_ >: String, _ <: LongAdder], actual: (String) => Any

提前谢谢你

弗朗西斯

最佳答案

问题是您正在使用 java.util.concurrent.ConcurrentHashMap , 它接受 java.util.function.Function作为 computeIfAbsent() 的参数而不是 scala.Function1你传递给它。

由于 scala 不像 Java 那样支持函数式接口(interface)的 lambda 转换(至少不支持 -Xexperimental flag ),您可以通过实现 java.util.function.Function 来解决这个问题。明确:

val data = new ConcurrentHashMap[String, LongAdder]
val adderSupplier = new java.util.function.Function[String, LongAdder]() {
  override def apply(t: String): LongAdder = new LongAdder()
}
data.computeIfAbsent("bob", adderSupplier).increment()

或者,如果您更频繁地需要它,您可以编写一个实用转换函数,甚至是一个隐式转换:
object FunctionConverter {
  implicit def scalaFunctionToJava[From, To](function: (From) => To): java.util.function.Function[From, To] = {
    new java.util.function.Function[From, To] {
      override def apply(input: From): To = function(input)
    }
  }
}

import FunctionConverter._
val data = new ConcurrentHashMap[String, LongAdder]()
data.computeIfAbsent("bob", (k: String) => new LongAdder()) // <- implicit conversion applied here

关于scala - 如何在 Scala 中使用 ConcurrentHashMap computeIfAbsent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36827482/

相关文章:

java - Scala Stream 与 Java Stream 懒惰差异

java - Apache KafkaServer 从 Java 创建记者

arrays - 如何指定任意嵌套长度的嵌套数组的返回类型?

scala - 使用scala读取后如何删除hdfs目录中的文件?

java - 在并发 HashMap 中重新散列期间检索

java - 将对象重新放入 ConcurrentHashMap 是否会导致 "happens-before"内存关系?

scala - Spark mapWithState 更新状态输出

Java - 通过 HashMap

java - ConcurrentHashMap 中位移运算符的使用

java - 简单、便宜的并发列表或集合?