1135 Stimmen

:: (Doppelpunkt Doppelpunkt) Operator in Java 8

Ich habe den Java 8-Quellcode erkundet und diesen bestimmten Codeteil als sehr überraschend gefunden:

// In IntPipeline.java definiert
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
    return evaluate(ReduceOps.makeInt(op));
}

@Override
public final OptionalInt max() {
    return reduce(Math::max); // Dies ist die überraschende Zeile
}

// In Math.java definiert
public static int max(int a, int b) {
    return (a >= b) ? a : b;
}

Ist Math::max ähnlich wie ein Methodenzeiger?
Wie wird eine normale static-Methode in einen IntBinaryOperator umgewandelt?

1voto

Liutong Chen Punkte 2455

Die vorherigen Antworten sind ziemlich vollständig, was die :: Methodenreferenz tut. Zusammenfassend ermöglicht es eine Möglichkeit, auf eine Methode (oder Konstruktor) zu verweisen, ohne sie auszuführen, und wenn es ausgewertet wird, erstellt es eine Instanz des funktionalen Interfaces, das den Zieltypkontext bereitstellt.

Im Folgenden sind zwei Beispiele zur Suche nach einem Objekt mit dem maximalen Wert in einem ArrayList mit und ohne der Verwendung von :: Methodenreferenz. Erläuterungen finden Sie in den Kommentaren unten.


Ohne die Verwendung von ::

import java.util.*;

class MyClass {
    private int val;
    MyClass (int v) { val = v; }
    int getVal() { return val; }
}

class ByVal implements Comparator {
    // bei Verwendung der Methodenreferenz muss diese Klasse nicht erstellt werden
    public int compare(MyClass source, MyClass ref) {
        return source.getVal() - ref.getVal();
    }
}

public class FindMaxInCol {
    public static void main(String args[]) {
        ArrayList myClassList = new ArrayList();
        myClassList.add(new MyClass(1));
        myClassList.add(new MyClass(0));
        myClassList.add(new MyClass(3));
        myClassList.add(new MyClass(6));

        MyClass maxValObj = Collections.max(myClassList, new ByVal());
    }
}

Mit der Verwendung von ::

import java.util.*;

class MyClass {
    private int val;
    MyClass (int v) { val = v; }
    int getVal() { return val; }
}

public class FindMaxInCol {
    static int compareMyClass(MyClass source, MyClass ref) {
        // Diese statische Methode ist mit der compare() Methode, die von Comparator definiert ist, kompatibel.
        // Daher ist es nicht notwendig, Comparator explizit zu implementieren und eine Instanz wie im ersten Beispiel zu erstellen.
        return source.getVal() - ref.getVal();
    }

    public static void main(String args[]) {
        ArrayList myClassList = new ArrayList();
        myClassList.add(new MyClass(1));
        myClassList.add(new MyClass(0));
        myClassList.add(new MyClass(3));
        myClassList.add(new MyClass(6));

        MyClass maxValObj = Collections.max(myClassList, FindMaxInCol::compareMyClass);
    }
}

-3voto

Der Doppelpunkt, d. H. der :: Operator, wurde in Java 8 als Methodenreferenz eingeführt. Eine Methodenreferenz ist eine Form einer Lambda-Ausdrucks, die verwendet wird, um die vorhandene Methode nach ihrem Namen zu referenzieren.

Klassenname::Methodenname

Beispiel:

  • stream.forEach(element -> System.out.println(element))

Indem man den Doppelpunkt :: benutzt

  • stream.forEach(System.out::println(element))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X