2014-10-25 19 views
6

Tất cả những gì tôi mong muốn là sử dụng một số Set đồng thời (dường như không tồn tại chút nào). Java sử dụng java.util.concurrent.ConcurrentHashMap<K, Void> để đạt được hành vi đó. Tôi muốn làm sth tương tự tại Scala vì vậy tôi tạo ra thể hiện của Scala HashMap (hoặc Java ConcurrentHashMap) và cố gắng thêm một số các bộ:làm thế nào để nhanh chóng Đơn vị trong Scala?

val myMap = new HashMap[String, Unit]() 
myMap + (("myStringKey", Unit)) 

Điều này tất nhiên bị rơi quá trình biên soạn như Unit là trừu tượng và cuối cùng .

Cách thực hiện công việc này? Tôi có nên sử dụng Any/AnyRef thay thế không? Tôi phải đảm bảo không ai chèn bất kỳ giá trị nào.

Nhờ sự giúp đỡ

+1

Lưu ý, 'java.util.concurrent.ConcurrentHashMap ' là sai. Loại 'Void' (vốn thông báo' V') chỉ có thể chấp nhận giá trị 'null', nhưng [tài liệu cho' ConcurrentHashMap'] (http://docs.oracle.com/javase/7/docs/api/java /util/concurrent/ConcurrentHashMap.html) đặc biệt không cho phép các khóa/giá trị 'null' trong bản đồ. Cách thực hiện điều này thường được thực hiện là 'ConcurrentHashMap ', sử dụng hằng số' Boolean.TRUE' cho các giá trị. (Sử dụng hằng số 'Boolean.TRUE' đảm bảo rằng bạn không tạo một cá thể' Boolean' mới cho mỗi mục nhập trong bản đồ.) – DaoWen

+0

hiệu chỉnh (void -> Void) được tiến hành, sử dụng 'Boolean.TRUE' là một mẹo rất hay, cảm ơn – petrbel

+0

bạn có chắc là bạn nên sử dụng 'Đơn vị' ở đó không? làm thế nào về 'Tùy chọn' hoặc một ADT tùy chỉnh (gia đình lớp vỏ kín)? –

Trả lời

11

Bạn có thể chỉ cần sử dụng () có loại là Unit:

scala> import scala.collection.mutable.HashMap 
import scala.collection.mutable.HashMap 

scala> val myMap = new HashMap[String, Unit]() 
myMap: scala.collection.mutable.HashMap[String,Unit] = Map() 

scala> myMap + ("myStringKey" ->()) 
res1: scala.collection.mutable.Map[String,Unit] = Map(myStringKey ->()) 

Đây là một bình luận lấy từ Unit.scala:

Chỉ có một giá trị của loại Unit , () và không được đại diện bởi bất kỳ đối tượng nào trong hệ thống thời gian chạy cơ bản.

+3

Có thể thêm rằng khi bạn nói 'val x =()', những gì bạn nhận được là giá trị đóng hộp, 'scala.runtime.BoxedUnit.UNIT'. Ngoài ra, '()' có loại Đơn vị: để nói "kiểu trả về" có thể gây nhầm lẫn cho mọi người vì sử dụng paren trong các ứng dụng chức năng. Giá trị đơn vị trông giống như một tuple rỗng, không phải là một ứng dụng lạ. –

Các vấn đề liên quan