在scala,Array [Int]和Array [Option [Int]]中输入Mismatch

时间:2017-09-23 08:16:08

标签: arrays scala bigdata

首先,我是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)我的错误是什么?

提前致谢。

3 个答案:

答案 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)