class DefaultListMap[A, B <: List[B]] extends HashMap[A, B] {
override def default(key: A) = List[B]()
}
地図を作成したくないA -> List[B]
。私の場合はLong -> List[String]
しかし、値のないマップからキーを取得すると、List
がスローされるのではなく、空のException
を作成したいと思います。さまざまな組み合わせを試しましたが、上記のコードをコンパイラに渡す方法がわかりません。
前もって感謝します。
なぜwithDefaultValue(value)を使用しないのですか?
scala> val m = Map[Int, List[String]]().withDefaultValue(List())
m: scala.collection.immutable.Map[Int,List[String]] = Map()
scala> m(123)
res1: List[String] = List()
apply
を使用してマップにアクセスするのではなく、常にget
を使用して、Option[V]
を返し、次にgetOrElse
を返すことができます。
map.get(k) getOrElse Nil
scalaz関数型プログラミングライブラリの優れた機能の1つは、単項演算子~
で、これは「またはゼロ」を意味します"、値の型に"ゼロ "が定義されている限り(もちろんList
が行い、ゼロはNil
です)。したがって、コードは次のようになります。
~map.get(k)
(たとえば)値がInt
、Double
など(Zero
タイプクラスがあるもの)の場合に同じ構文が機能するため、これは二重に役立ちます。
特にisDefinedAt
メソッドに関してこれがどのように動作するかにより、scalaメーリングリストではMap.withDefault
の使用について多くの議論がありました。私はこの理由でそれを避けようとする傾向があります。
withDefaultValue
にメソッドMap
があります:
scala> val myMap = Map(1 -> List(10), 2 -> List(20, 200)).withDefaultValue(Nil)
myMap: scala.collection.immutable.Map[Int,List[Int]] = Map((1,List(10)), (2,List(20, 200)))
scala> myMap(2)
res0: List[Int] = List(20, 200)
scala> myMap(3)
res1: List[Int] = List()
このためのメソッドがすでにあるのに、なぜマップを操作したいのですか?
val m = Map(1L->List("a","b"), 3L->List("x","y","z"))
println(m.getOrElse(1L, List("c"))) //--> List(a, b)
println(m.getOrElse(2L, List("y"))) //--> List(y)
withDefaultも使用できます。
/** The same map with a given default function.
* Note: `get`, `contains`, `iterator`, `keys`, etc are not affected
* by `withDefault`.
*
* Invoking transformer methods (e.g. `map`) will not preserve the default value.
*
* @param d the function mapping keys to values, used for non-present keys
* @return a wrapper of the map with a default value
*/
def withDefault[B1 >: B](d: A => B1): immutable.Map[A, B1]
例:
scala> def intToString(i: Int) = s"Integer $i"
intToString: (i: Int)String
scala> val x = Map[Int, String]().withDefault(intToString)
x: scala.collection.immutable.Map[Int,String] = Map()
scala> x(1)
res5: String = Integer 1
scala> x(2)
res6: String = Integer 2
お役に立てれば。