[英]Scala Spark - java.lang.UnsupportedOperationException: empty.init
[英]Scala Map and ConcurrentHashMap throw a java.lang.UnsupportedOperationException
有了這個簡單的代碼
import scala.collection.JavaConversions._
new java.util.concurrent.ConcurrentHashMap[String,String] ().toMap.put("abc","def")
Scala拋出java.lang.UnsupportedOperationException。
為什么?
那么這就是發生的事情(我認為):
new java.util.concurrent.ConcurrentHashMap[String,String]()
創建並發java哈希映射 toMap
將其轉換為不可變的scala Map toMap
未在java.util.concurrent.ConcurrentHashMap
定義,因此將應用隱式轉換為可變 scala映射。 然后toMap
使這個可變 Map
成為一個不可變的 Map
。 scala.collection.immutable.Map
定義的'put(...)'。 import scala.collection.JavaConversions._
java.util.Map
找到從scala.collection.immutable.Map
到java.util.Map
的轉換,其中定義了put(...)
方法。 但是,轉換返回一個擴展AbstractMap
的包裝器。 put(...)
方法。 因此,調用最終在java.util.AbstractMap
的默認實現java.util.AbstractMap
,它實際上沒有實現put(...)
,而是拋出UnsupportedOperationException
我想這引起的混亂,是大多數scala開發人員更喜歡import scala.collection.JavaConverters._
不是import scala.collection.JavaConversions._
一個原因。
所以,我想,這可能是你想要做的:
import scala.collection.JavaConverters._
new java.util.concurrent.ConcurrentHashMap[String,String]().asScala.put("abc","def")
與Java不同,Scala中的默認集合是不可變的。 如果你看一看的API Map
(發現這里 ),你會看到Map
缺少的方法put
。 所以異常正確地告訴你, Map
不能做你想做的事。 如果要使用值填充Map
:
Map("abc" -> "def")
順便說一句,不可變集合已經是線程安全的。 無需使用ConcurrentHashMap
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.