Frage zu Lambda-Expressions

Ich habe eine Klasse, welche Textdateien einliest. Der Aufruf funktioniert normalerweise so:

    FullTextFileReader reader = new FullNormalTextFileReader(filename, charset);
    reader.setLineDescription("XYZ-Daten");
    reader.setProgressTextStart("Einlesen");
    //reader.skipFirstLine();
    reader.beQuiet();
    reader.read(line -> analyseLine(line));

die Methode reader.read() erwartet als Parameter ein Objekt vom Typ des Interfaces NotEmptyLineAnalyzer. Dieses sieht wie folgt aus:

public interface NotEmptyLineAnalyzer {

    void analyseLine(String line);

}

Dementsprechend habe ich dann in der benutzenden Klasse eine Methode

private void analyseLine(String line) {
    // ...
}

In der ich die nicht-leeren Zeilen der Datei verarbeite.
So weit ist mit alles klar.

Ich kann aber auch folgendes schreiben, ohne etwas am Interface verändert zu haben:

    FullTextFileReader reader = new FullNormalTextFileReader(filename, charset);
    reader.setLineDescription("XYZ-Daten");
    reader.setProgressTextStart("Einlesen");
    //reader.skipFirstLine();
    reader.beQuiet();
    reader.read(line -> analyseLine(line, reader.getLineNumber()));

und eine Methode

private void analyseLine(String line, int lineNumber) {
    // ...
}

verwenden, die die Zeile und die Zeilennummer (z.B. für Ausnahmen etc.) erhält.

Meine Frage ist nun, wieso das funktioniert, da das Interface ja ganz klar analyseLine als Methode mit einem Parameter definiert.

Das geht weil dein Lambda nur den Parameter “line” benutzt.
Du erzeugst quasi eine anonyme Klasse deines Interfaces und rufst darin deine analyeLine(String,int) auf. Das merkst du wenn du statt deines Lambdas eine Methodenreferenz benutzt.

private void analyseLineOne(String line) {...}
private void analyseLineTwo(String line, int linenumber {...}
reader.read(this::analyseLineOne); //Geht
reader.read(this::analyseLineTwo); //Geht nicht weil das Interface nicht passt