【发布时间】:2014-12-21 04:39:54
【问题描述】:
我只想使用一些并发的 Set(似乎根本不存在)。 Java 使用java.util.concurrent.ConcurrentHashMap<K, Void> 来实现该行为。我想在 Scala 中做类似的事情,所以我创建了 Scala HashMap(或 Java ConcurrentHashMap)的实例并尝试添加一些元组:
val myMap = new HashMap[String, Unit]()
myMap + (("myStringKey", Unit))
这当然会导致编译过程崩溃,因为 Unit 是抽象的和最终的。
如何做到这一点?我应该改用Any/AnyRef 吗?我必须确保没有人插入任何值。
感谢您的帮助
【问题讨论】:
-
注意,
java.util.concurrent.ConcurrentHashMap<K, void>是错误的。Void类型(注意大写V)只能接受null值,但the documentation forConcurrentHashMap明确禁止映射中的null键/值。这通常是如何实现的,ConcurrentHashMap<K, Boolean>,使用常量Boolean.TRUE作为值。 (使用常量Boolean.TRUE可确保您不会为地图中的每个条目创建新的Boolean实例。) -
更正(void -> Void)继续进行,使用
Boolean.TRUE是个不错的技巧,谢谢 -
你确定你应该在那里使用
Unit吗?Option或自定义 ADT(密封案例类族)怎么样? -
我不确定,我只需要并发集 - 我使用了布尔技巧,它工作正常。
-
这个问题确实是一个非常有效的问题,独立于给定的上下文和用例。您需要一种在函数式编程语言中实例化 Unit 类型的方法,因为它是在其上创建 ADT 和标识函数的非常重要的构建块。
标签: java scala concurrency hashmap set