def loop2 (arr: List[String]) : List[String]= {
arr.map(ele =>
if (ele.startsWith("2")) ele)
}
我认为该方法应该返回一个List [String],但是编译器说它应该返回List [Any]。
地图内的匿名函数可以返回String或什么都不是,这意味着输出可以是空列表或List [String]。
请解释为什么返回类型应为List [Any]
答案 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"))
}