Achso, also wenn ich z. B. sage Strings :: System.out.println, dann mache ich den Doppelpunkt weil syso schon existiert? Wenn ja, warum macht man aber system.out :: println, das heißt ja eigentlich system.out.println?
System ist eine Klasse, die eine statische Variable namens out vom Typ PrintStream enthält. Die wird ganz normal via System.out angesprochen. Jetzt willst Du eine Methode aus PrintStream referenzieren (nicht aufrufen!), nämlich println. Und das erfolgt nun mit dem zwei Doppelpunkten: System.out::println.
Diese Schreibweise xyz::method funktioniert genau dann, wenn die Methode die gleiche Anzahl (und Typen) an Parametern akzeptiert, die vom Stream geliefert werden, sie also einer entsprechenden BiConsumer, TriConsumer, BiFunction, Trifunction entspricht.
Ich hab mit mal eine Klasse PairList geschrieben, welche für ihre forEach Methode einen BiConsumer erwartet.
Java:
claee MyClass{publicstaticvoidmain1(String[] args){PairList<String,Integer> list =newPairList<>();//Erwartet für forEach BiConsumer<String, Integer>//..fill List
list.forEach((s,l)->myBiFunction(s, l));
list.forEach(MyClass::myBiFunction);}privatestaticvoidmyBiFunction(String s,Integer i){}}
Eine weitere Möglichkeit, die beiden Punkte zu verwenden, ist, wenn ein Supplier der Variable aufgerufen werden soll.
Java:
var names1 =Arrays.stream(EnumClass.values()).map(e -> e.name()).collect(Collectors.toList());var names2 =Arrays.streamEnumClass.values()).map(EnumClass::name).collect(Collectors.toList());
Wie mihe schon gesagt hat, was nach den beiden Doppelpunkten kommt, ist der Methodenname.
Davor bezeichnet man den Referenzpunkt für die Methode auf klassische Weise. Dies kann eben wie oben genannt "System.out" sein oder "this" für die aktuelle Instanz oder in meinem Beispiel "MyClass", da es sich um eine statische Methode handelt, auch ein Variablenname ist möglich