Scala,读取文件操纵每一行,将每一行插入列表

时间:2014-06-13 00:41:00

标签: list scala input scala-2.9 mutability

我逐行读取文件,替换子字符串"替换" with substring" replacment"。一旦字符串操作完成,我想将每一行插入一个列表。

def importFile(replaceString:String, filePath:String, replacement:String)= {
  val fileLineList = io.Source.fromURL(getClass.getResource(filePath))
    .getLines
    .foreach(line => {line.replace(replaceString,replacement)}.toList)
  print(fileLineList)
}

当我调用该函数时,返回的是:

()

任何想法,?

1 个答案:

答案 0 :(得分:2)

如果要返回字符串列表,可以执行以下两项操作之一:

def importFile(replaceString:String, filePath:String, replacement:String)= {
  io.Source.fromURL(getClass.getResource(filePath))
    .getLines
    .map(_.replace(replaceString,replacement))
}

def importFile(replaceString:String, filePath:String, replacement:String)= {
  val fileLineList = io.Source.fromURL(getClass.getResource(filePath))
    .getLines
    .map(_.replace(replaceString,replacement))
  print(fileLineList)
  fileLineList
}

第一个变体不会打印任何内容,但会返回结果(替换后来自文件的所有行)。第二个变体将打印替换版本,然后将其返回。

通常,在Scala中,函数的结果是它的最后一个语句。请记住声明如下:

val myValue = 5

不会返回任何内容(其类型为Unit),而

myValue

(如果之前已定义)将指定结果作为存储在myValue中的内容。

.map(_.replace(replaceString,replacement))部分应该使用replace来转换每个原始行。 <{1}}是

的语法糖
_

也可以写成

.map(x => x.replace(replaceString, replacement))

但在这个简单的情况下,没有必要。如果你有一个由几个语句组成的映射函数,那么Curlies就有意义了,例如:

.map{x => x.replace(replaceString, replacement)}

最重要的部分是.map{x => val derivedValue = someMethod(x) derivedValue.replace(replaceString, replacement) } .map

之间的区别

.foreach将原始序列转换为新序列(根据映射函数)并返回此序列(在您的情况下,字符串列表)。

.map遍历给定的序列并对序列中的每个条目执行指定的操作,但它不返回任何内容 - 它的返回类型是Unit。

(检查Scaladoc for List以获取有关这些和其他功能的更多信息: http://www.scala-lang.org/api/2.10.3/index.html#scala.collection.immutable.List