Другие ответы справедливо указываются на mkString
, и для обычного объема данных я бы также использовал это.
Однако mkString
создает (накапливает) конечный результат в памяти черезStringBuilder
.Это не всегда желательно, в зависимости от количества данных, которые у нас есть.
В этом случае, если все, что мы хотим, это «напечатать», нам не нужно сначала создавать большой результат (и, возможно, мыдаже хочу этого избежать).
Рассмотрим реализацию этой вспомогательной функции:
def forEachIsLast[A](iterator: Iterator[A])(operation: (A, Boolean) => Unit): Unit = {
while(iterator.hasNext) {
val element = iterator.next()
val isLast = !iterator.hasNext // if there is no "next", this is the last one
operation(element, isLast)
}
}
Она перебирает все элементы и вызывает operation
, передавая каждый элемент по очереди, с логическим значением,Значение равно true
, если переданный элемент является последним .
В вашем случае его можно использовать так:
forEachIsLast(myData) { (line, isLast) =>
if(isLast)
println("}")
else
println("}, {")
}
У нас есть следующееПреимущества здесь:
- Он работает по каждому элементу, один за другим, без необходимости накапливать результат в памяти (если вы этого не хотите).
- Поскольку ему не нужно загружатьВся коллекция в памяти, чтобы проверить ее размер, достаточно спросить у Итератора, исчерпан ли он или нет.Вы можете читать данные из большого файла или из сети и т. Д.