Operator :: (Doppelpunkt) in Java 8: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Operator :: (Double Colon) in Java 8: Vom Anfänger zum Profi

\n\n

Haben Sie jemals Java 8-Code geschrieben und eine seltsame Konstruktion wie System.out::println oder String::length gesehen? Sieht aus wie Magie, nicht wahr? Tatsächlich ist es keine Magie, sondern eines der elegantesten Werkzeuge des modernen Java – der Doppelpunkt-Operator (auch double colon operator oder Methodenreferenz genannt).

\n\n

In diesem Artikel analysieren wir den Operator :: von den Grundlagen bis zu fortgeschrittenen Techniken. Sie lernen, saubereren, prägnanteren und lesbareren Code zu schreiben. Los geht's!

\n\n

Was ist der Operator :: und wozu wird er benötigt?

\n\n

Der Operator :: (double colon) wurde in Java 8 als syntaktischer Zucker für Lambda-Ausdrücke eingeführt. Wenn ein Lambda-Ausdruck einfach eine vorhandene Methode aufruft, können Sie ihn durch eine Methodenreferenz ersetzen. Das macht den Code kürzer und ausdrucksstärker.

\n\n

Vergleichen Sie selbst:

\n\n
// Lambda-Ausdruck\nlist.forEach(s -> System.out.println(s));\n\n// Methodenreferenz (Operator ::)\nlist.forEach(System.out::println);
\n\n

Die zweite Variante ist nicht nur kürzer, sondern sagt sofort: "Rufe für jedes Element die Methode println von System.out auf". Wunderbar!

\n\n

Vier Arten von Methodenreferenzen

\n\n

In Java 8 gibt es vier Haupttypen von method reference. Lassen Sie uns jeden mit Beispielen durchgehen.

\n\n

1. Referenz auf eine statische Methode

\n\n

Syntax: ClassName::staticMethodName

\n\n

Beispiel: Zählen der geraden Zahlen in einer Liste.

\n\n
import java.util.Arrays;\nimport java.util.List;\n\npublic class StaticMethodReference {\n    public static boolean isEven(Integer number) {\n        return number % 2 == 0;\n    }\n\n    public static void main(String[] args) {\n        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);\n        \n        // Lambda\n        long countLambda = numbers.stream()\n                .filter(n -> StaticMethodReference.isEven(n))\n                .count();\n        \n        // Referenz auf statische Methode\n        long countRef = numbers.stream()\n                .filter(StaticMethodReference::isEven)\n                .count();\n        \n        System.out.println("Gerade Zahlen: " + countRef); // 3\n    }\n}
\n\n

Beachten Sie: Wir rufen die Methode isEven nicht auf – wir übergeben nur eine Referenz darauf. Java setzt selbst jedes Element der Liste als Argument ein.

\n\n

2. Referenz auf eine Instanzmethode eines bestimmten Objekts

\n\n

Syntax: objectReference::instanceMethodName

\n\n

Diese Art wird verwendet, wenn Sie bereits ein bestimmtes Objekt haben und dessen Methode aufrufen möchten.

\n\n
import java.util.Arrays;\nimport java.util.List;\n\npublic class InstanceMethodReference {\n    public static void main(String[] args) {\n        List<String> names = Arrays.asList("Anna", "Boris", "Viktor");\n        \n        // StringBuilder-Objekt erstellen\n        StringBuilder sb = new StringBuilder("Namen: ");\n        \n        // Lambda\n        names.forEach(name -> sb.append(name).append(" "));\n        \n        // Referenz auf Instanzmethode\n        // (aber append gibt StringBuilder zurück, daher verwenden wir Lambda)\n        // Für System.out.println ist es jedoch ideal:\n        names.forEach(System.out::println);\n        \n        System.out.println(sb.toString()); // Namen: Anna Boris Viktor\n    }\n}
\n\n

Das klassische Beispiel ist System.out::println. System.out ist ein bestimmtes PrintStream-Objekt und println ist dessen Methode.

\n\n

3. Referenz auf eine Instanzmethode eines beliebigen Objekts eines bestimmten Typs

\n\n

Syntax: ClassName::instanceMethodName

\n\n

Diese Art wird oft mit der vorherigen verwechselt. Hier geben wir kein bestimmtes Objekt an – stattdessen sagen wir: "Nimm ein beliebiges Objekt dieser Klasse und rufe seine Methode auf".

\n\n


                
                

Blogs

Buchempfehlungen