2016-09-09 1 views
1

Ich habe den folgenden Code-Schnipsel:Scala foldLeft mit einer Liste

import scala.io.Source 
object test extends App { 

    val lineIterator = Source.fromFile("test1.txt").getLines() 


    val fileContent = lineIterator.foldLeft(List[String]())((list, currentLine) => { 
    currentLine :: list 
    list 
    }) 


    fileContent foreach println 

} 

Nehmen wir an, die test1.txt Datei nicht leer ist und hat einige Werte drin. Also meine Frage über die foldLeft Funktion ist, warum gibt dieses Beispiel hier eine leere Liste zurück, und wenn ich die list am Ende der foldLeft Funktion entfernen funktioniert es? Warum gibt es eine leere Liste unter dem Wert fileContent zurück?

Antwort

3

Die Linie currentLine :: list nicht die ursprüngliche Liste mutieren. Es erstellt eine neue Liste mit vorangestelltem currentLine und gibt diese neue Liste zurück. Wenn dieser Ausdruck nicht der letzte in Ihrem Block ist, wird er einfach verworfen und die (noch) leere list wird zurückgegeben. Wenn Sie die list am Ende entfernen, geben Sie tatsächlich currentLine :: list zurück.

+0

nette Erklärung ... das ist, was ich auch dachte – Bajro

0

Liste ist unveränderbar, daher ist sie nach currentLine :: list immer noch leer. Daher gibt der Code in Klammern eine leere Liste zurück, die dann mit dem nächsten Element gefaltet wird und immer noch eine leere Liste zurückgibt.

1

Sie rufen foldLeft mit einigen Startwert (in Ihrem Fall eine leere Liste) und eine Funktion, die einen Akku und den aktuellen Wert nimmt. Diese Funktion gibt dann die neue Liste zurück. In Ihrer Implementierung wird die leere Liste vom ersten Aufruf bis zum Ende der Funktionsausführung weitergegeben. Deshalb erhalten Sie als Ergebnis eine leere Liste.

Bitte sehen Sie sich dieses Beispiel: https://twitter.github.io/scala_school/collections.html#fold

Verwandte Themen