首先,我是Scala的新手,如果以下问题太简单,请道歉。
我编写了以下代码,以便从地图中查找我在数组中提供的键的值。
def stringToCountMap(inputArray: Array[String], inputMap:Map[String,Int]) : Array[Int] = {
return inputArray.map(x => inputMap.get(x))
}
我收到了以下错误,
type mismatch;
found : Array[Option[Int]]
required: Array[Int]
return inputArray.map(x => inputMap.get(x))
问题: 1)任何人都可以解释什么是Option [Int]? 2)我的错误是什么?
提前致谢。
答案 0 :(得分:0)
首先,不需要在scala中使用'return'来返回任何值。
def stringToCountMap(inputArray: Array[String], inputMap:Map[String,Int]) = {
inputArray.map(x => inputMap.get(x))
}
从Map获取key的值时,它会在Option中返回结果。 例如:
scala> val map = Map(1-> "a",2 -> "b")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)
scala> map.get(1)
res0: Option[String] = Some(a)
scala> map.get(3)
res1: Option[String] = None
当您尝试获取key的值时,该值不存在。在java中,您遇到过NullPointerException。因此,当没有值时,它返回None以避免异常。 有关详细信息,请refer 在您的方法中,您已将返回类型指定为Array [Int],但函数返回Array [Option [Int]],这就是它抛出编译错误的原因。
答案 1 :(得分:0)
Option
是Scala的option type(也称为nullable type)。它表示可能不存在该值的情况。
考虑一个不包含请求密钥的地图。你会如何处理密钥请求?一种选择是导致错误,例如抛出异常。另一种方法是返回一个特殊值,表示没有值。 Map.get
执行后者,使用Option
作为特殊类型,使用None
作为值。这意味着Map.get
的返回类型不是地图的值类型(Int
),但Option
应用于值类型(Option[Int]
)。< / p>
要更正类型声明,请更改返回类型:
def stringToCountMap(inputArray: Array[String], inputMap:Map[String,Int]) : Array[Option[Int]] = {
inputArray.map(x => inputMap.get(x))
}
您可以省略stringToCountMap
的返回类型,并让类型推断处理它:
def stringToCountMap(inputArray: Array[String], inputMap:Map[String,Int]) = {
inputArray.map(x => inputMap.get(x))
}
因此,输入地图中缺少的键可以通过:
scala> stringToCountMap(Array("a", "def"), Map("a" -> 1, "bc" -> 2))
res0: Array[Option[Int]] = Array(Some(1), None)
答案 2 :(得分:0)
Option[T]
是类型为T
的值的包装器。其目的是防止您可能从Java中了解NullPointerException
。类型Option[T]
的值可能是None
,顾名思义是一个不代表任何内容的对象,或者它可能是Some(x: T)
,它代表一个现有值。
inputMap(x)
会返回Option[Int]
,因为您无法保证x
中存在inputMap
密钥。如果是,则返回Some(value: Int)
,否则返回None
。
致电stringToCountMap(Array("a", "b", "c"), Map("a" -> 1, "c" -> 2))
会产生Array(Some(1), None, Some(2))
如果您想要Array[Int]
,可以执行inputArray.map(x => inputMap.getOrElse(x, 0)).get
之类的操作。 getOrElse
方法有两个参数,第一个是键,第二个是默认值。 inputArray.map(x => inputMap.get(x).getOrElse(0))
具有相同的效果,因为在getOrElse(value)
上调用Option
可以展开Some
对象,或者返回默认值。
现在,stringToCountMap(Array("a", "b", "c"), Map("a" -> 1, "c" -> 2))
会产生Array(1, 0, 2)
。
您可能还想省略输入数组中缺少的键。在这种情况下,您可能会inputArray.flatMap(x => inputMap.get(x))
。 flatMap
是一个类似于map
的函数,但它严格地返回,顾名思义,是平面集合。例如,在flatMap(x => x)
上调用Array[Array[Int]]
将在一行中返回2D数组中所有值的Array
。
这里,Option
也是一个集合。如果它是Some
类型,则它包含单个值,如果它是None
,则它是一个空集合。因此,在结果数组中,您只能使用地图中存在的键值,并且会跳过地图中不存在的键。
现在,stringToCountMap(Array("a", "b", "c"), Map("a" -> 1, "c" -> 2))
会产生Array(1, 2)
。