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)

Другие вопросы по тегам