我是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 :(得分:3)
有两件事阻止了返回结果:
println
返回Unit
Unit
这会给你预期的结果:
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:固定返回类型