Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams?
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 {
public static void main1(String[] args) {
PairList<String, Integer> list = new PairList<>(); //Erwartet für forEach BiConsumer<String, Integer>
//..fill List
list.forEach((s,l) -> myBiFunction(s, l));
list.forEach(MyClass::myBiFunction);
}
private static void myBiFunction(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