Проблема заключается в том, что вы используя java.util.concurrent.ConcurrentHashMap
, который принимает java.util.function.Function
в качестве номинала ameter для computeIfAbsent()
вместо scala.Function1
, который вы передаете ему.
Поскольку Scala не поддерживает преобразование лямбда для функциональных интерфейсов, как Java делает (по крайней мере, не без -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