斯卡拉新手警报:
基本上我正在尝试这样做:我模式匹配并返回一个字符串。
scala> def processList(list: List[String], m: String): String={list foreach (x=> m match{
| case "test" => "we got test"
| case "test1"=> "we got test1"})}
:10:错误:类型不匹配; 发现:单位 必需:字符串 def processList(list:List [String],m:String):String = {list foreach(x => m match {
我知道我可以设置一个var并在for comp之后返回它......但这似乎不是Scala方式。
答案 0 :(得分:9)
我不完全清楚你要做的究竟是什么。您是否只想测试列表中是否存在某个元素?或者您想要返回一些带有转换的字符串列表?例如,后者可以这样写:
scala> def processList(l: List[String]): List[String] = l map {s => s match {
case "test" => "we got test"
case "test1" => "we got test1"
case _ => "we got something else"
}
}
scala> processList(List("test", "test1", "test2", "test3"))
res: List[String] = List(we got test, we got test1, we got something else, we got something else)
对于前者,你可以写出类似的东西:
scala> def exists(l: List[String], m: String): String = {
if (l exists (s => s == m))
m + " exists"
else
m + " does not exist"
}
exists: (l: List[String],m: String)String
scala> val l = List("test1", "test2", "test3")
l: List[java.lang.String] = List(test1, test2, test3)
scala> exists(l, "test1")
res0: String = test1 exists
scala> exists(l, "test2")
res1: String = test2 exists
scala> exists(l, "test8")
res2: String = test8 does not exist
在任何情况下:List上的foreach方法遍历列表中的每个元素,将给定的函数应用于每个元素。它主要用于副作用,例如将某些内容打印到控制台或写入文件。传递给foreach方法的函数必须返回Unit类型,就像Java中的void一样。因此,您无法从中返回单个字符串。
答案 1 :(得分:3)
您需要使用map
,而不是foreach
。然后你可以返回字符串列表(就像你写的一样,除了返回类型是List[String]
),或者你可以使用.mkString(" ")
将它们粘在一起(这将在它们之间放置空格)。
答案 2 :(得分:1)
def processList(list: List[String], m: String): String= {
list foreach (x=> m match {
case "test" => return "we got test"
case "test1"=> return "we got test1"
})
error("oops")
}
答案 3 :(得分:0)
要动态返回单个结果 - 也许通过连接单个结果,您可以使用(INIT /:COLLECTION)(_ OPERATION _),如下所示:
val li = List ("test", "test", "test1", "test")
("" /: li) ((x, y) => x + { y match {
case "test" => "we got test\n"
case "test1" => "we got test 1\n" } } )
res74:java.lang.String = 我们接受了考试 我们接受了考试 我们得到了测试1 我们得到了测试