Scala, читать файл, манипулировать каждой строкой, вставлять каждую строку в список
Я читаю файл построчно, заменяя подстроку "replace" на подстроку "replacecment". После завершения работы со строками я хочу вставить каждую строку в список.
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 ответ
Если вы хотите вернуть свой список строк, вы можете сделать одну из двух вещей:
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))
Часть должна преобразовать каждую из исходных строк, используя замену. _
является синтаксическим сахаром для
.map(x => x.replace(replaceString, replacement))
который также может быть записан как
.map{x => x.replace(replaceString, replacement)}
но в этом простом случае это не обязательно. Curlies имели бы смысл, если бы у вас была функция отображения, состоящая из нескольких операторов, например:
.map{x =>
val derivedValue = someMethod(x)
derivedValue.replace(replaceString, replacement)
}
Наиболее важной частью является разница между .map
а также .foreach
:
.map
преобразует исходную последовательность в новую последовательность (в соответствии с функцией отображения) и возвращает эту последовательность (в вашем случае, список строк).
.foreach
выполняет итерацию по заданной последовательности и выполняет указанные операции над каждой записью в последовательности, но ничего не возвращает - ее тип возвращаемого значения - Unit.
(Проверьте Scaladoc для List для получения дополнительной информации об этих и других функциях: http://www.scala-lang.org/api/2.10.3/index.html)