如何在Scala中为for comprehension返回String?

时间:2010-06-04 15:16:26

标签: scala

斯卡拉新手警报:

基本上我正在尝试这样做:我模式匹配并返回一个字符串。

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方式。

4 个答案:

答案 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 我们得到了测试