Methodenliterale in Java
Listen
Eine Liste ist ein Objekt, welches eine Abfolge von Werten enthält. Man kann in ihr praktisch den Nachfolger von Reihungen sehen.
Das folgende Programm zeigt die Angabe einer Liste mit »java.util.Arrays.asList( "p", "q", "r" )« gefolgt von ihrer Ausgabe.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.util.Arrays.asList( "p", "q", "r" )); }}transcript
[p, q, r]
Das folgende Programm zeigt die Ausgabe der Anzahl der Einträge einer Liste:
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.util.Arrays.asList( "p", "q", "r" ).size() ); }}transcript
3
Die Klasse einer Liste ist »java.util.List«. Weitere Details zum Umgang mit Listen folgen erst später im Kurs. In dieser Lektion wird eine Liste vorerst nur in einigen Beispielen verwendet.
Methodenliterale
Eine Methode kann auch mit einem Pfeilsymbol »->« angegeben werden. Links von diesem steht der Parametername (hier »x«) und rechts der Methodenrumpf (Block).
Methode
public static void p( final java.lang.String x )
{ java.lang.System.out.println( x ); }Entsprechendes Methodenliteral
x ->
{ java.lang.System.out.println( x ); }
- Das Methodenliteral ist in dem obigen Beispiel ein Ausdruck, der eine Methode angibt, die einen Parameter »x« hat und diesen mit »java.lang.System.out.println« ausgibt
- Der Wert eines Methodenliterals ist eine Methode (Semantik ), die aber an der Stelle des Vorkommens des Methodenliterals noch nicht ausgeführt wird.
- Der Rumpf (die zweite Zeile) ist bei beiden Quelltexten gleich
- Die Methode des Methodenliterals hat keinen Namen
- Der Typ des Parameters »x« ist durch das Methodenliteral nicht bestimmt
- Das Pfeilsymbol »->« stellt eine einzige lexikalische Einheit dar.
Einbau von Methodenliteralen
Methoden dürfen als Argumente bestimmter Methoden verwendet werden. Wir behandeln hier noch nicht alle Regeln, sondern zeigen zunächst nur ein Beispiel.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.util.Arrays.asList( "A", "B", "C" ).forEach
( x ->{ java.lang.System.out.println( x ); } ); }}transcript
A
B
C
Zugriff auf Variablen der Umgebung
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int i = 2;
java.util.Arrays.asList( "" ).forEach
( x ->
{ final int j = 5;
java.lang.System.out.println( i );
java.lang.System.out.println( j ); } ); }}transcript
2
5
Zugriff auf Variablen der Umgebung
Echte Variablen können nicht erreicht werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ int i = 2;
i = i + 1;
java.util.Arrays.asList( "" ).forEach
( x ->
{ java.lang.System.out.println( i ); } ); i = i + 1; }}transcript
Main.java:9: error: local variables referenced from a lambda expression must be final or effectively final
{ java.lang.System.out.println( i ); }
^
1 error
Hinweis
Weitere Details zu Methodenmethoden und Methodenliteralen werden in späteren Lektionen behandelt werden.
Übungsfragen
? Übungsfrage
Welche Methodenreferenz hat dasselbe Verhalten wie die Methode des folgenden Methodenliterals?
- Methodenliteral
( java.lang.String s )->Integer.parseInt( s )