如何从Scala def返回值

如何从Scala def返回值,scala,Scala,我是Scala的新手,但对Haskell有一些经验。我做了以下工作: import scala.io.Source val fileContent = Source.fromFile(filename).getLines.toList val content = fileContent.map(processLine) def processLine(line: String){ val words = line.split("\\s+") println((words(0)

我是Scala的新手,但对Haskell有一些经验。我做了以下工作:

import scala.io.Source

val fileContent = Source.fromFile(filename).getLines.toList
val content = fileContent.map(processLine)

def processLine(line: String){
    val words = line.split("\\s+")
    println((words(0), words(1))) 
}
这里processLine不返回任何内容,因此内容现在是所有项的空返回值列表。我认为解决方案是在processLine中包含一个返回值,但Scala不喜欢这样:

warning: enclosing method processLine has result type Unit: return value discarded
那么,我如何修改processLine,以便它可以用来创建内容中非空元组值的列表呢?如何声明一个包含多行的lambda函数

多亏了这篇文章中的有用信息,我还可以用lambda表达式编写它:

var nonLinearTrainingContent = fileContent.map(x=> {
        val words = x.split("\\s+")
        (words(0), words(2))
        })
使元组(单词(0)、单词(1))成为processLine函数的最后一行:

def processLine(line: String) = {
  val words = line.split("\\s+")
  println((words(0), words(1))) 
  (words(0), words(1)) 
}
val processLineFun : String => (String, String) = line => {
  val words = line.split("\\s+")
  val result = (words(0), words(1))
  println(result)
  result
}
编辑:对多行lambda函数或带“;”的单独运算符使用大括号对于一行lambda


Edit2:固定返回类型

有两种情况会阻止返回结果:

  • println
    返回
    Unit
  • 函数定义是返回
    Unit
  • 这将为您提供您期望的结果:

    def processLine(line: String) : (String,String) = {
      val words = line.split("\\s+")
      val result = (words(0), words(1))
      println(result)
      result
    }
    
    正如所问的一样,将其表示为一个函数:

    def processLine(line: String) = {
      val words = line.split("\\s+")
      println((words(0), words(1))) 
      (words(0), words(1)) 
    }
    
    val processLineFun : String => (String, String) = line => {
      val words = line.split("\\s+")
      val result = (words(0), words(1))
      println(result)
      result
    }
    

    这仍然会返回
    Unit
    在用大括号括起来的方法体之前应该有“=”,请参见我的编辑。您是否也可以用lambda函数替换processLine?我认为这将完成/补充线程答案。。