此scala方法的返回类型:String vs Any

时间:2015-01-30 21:57:01

标签: scala

 def loop2 (arr: List[String]) : List[String]= {
   arr.map(ele =>
      if (ele.startsWith("2")) ele)
 }

我认为该方法应该返回一个List [String],但是编译器说它应该返回List [Any]。

地图内的匿名函数可以返回String或什么都不是,这意味着输出可以是空列表或List [String]。

请解释为什么返回类型应为List [Any]

2 个答案:

答案 0 :(得分:5)

您似乎正在尝试过滤掉不以"2"开头的元素?如果是这种情况,您应该使用filter

def loop2(arr: List[String]): List[String] = arr.filter(e => e.startsWith("2"))

或者

def loop2(arr: List[String]): List[String] = arr.filter(_.startsWith("2"))

匿名函数ele => if (ele.startsWith("2")) ele)的问题在于您没有处理else案例。没有if的{​​{1}}会自动使else返回else,然后强制公共类型为Unit

Scala Language Specification中所示:

  

条件表达式的简短形式消除了else部分。条件表达式if(e1)e2被评估为if(e1)e2 else()。

答案 1 :(得分:1)

您的else需要if,以便编译器找出您正在谈论的类型。就目前而言,它假设其他方面是(),因此唯一的可推导类型是Any

def loop2 (arr: List[String]) : List[String]= {
   arr.map(ele => if (ele.startsWith("2")) ele else "")
 }

您似乎正在尝试过滤:

def loop2 (arr: List[String]) : List[String]= {
   arr.filter(ele => ele.startsWith("2"))
 }

甚至更具惯用性:

def loop2 (arr: List[String]) : List[String]= {
   arr.filter(_.startsWith("2"))
}