如何从Scala def返回一个值

时间:2015-10-13 18:00:01

标签: 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), 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))
        })

2 个答案:

答案 0 :(得分:3)

有两件事阻止了返回结果:

  1. println返回Unit
  2. 您的函数定义是返回Unit
  3. 的方法的简写

    这会给你预期的结果:

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

    正如所提出的那样表达了一个功能:

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

答案 1 :(得分:1)

使元组(单词(0),单词(1))成为processLine函数的最后一行:

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

编辑:对多行lambda函数使用花括号或使用';'分隔运算符对于单行lambda

Edit2:固定返回类型