SORU
15 Kasım 2013, Cuma


:: (double kolon) Java 8'de operatör

Java 8 kaynak keşfediyordum ve bu kod belirli bir parçası çok şaşırtıcı buldu

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

@Override
public final OptionalInt max() {
    return reduce(Math::max); //this is the gotcha line
}

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

Math::max bir şey bir yöntem işaretçisi gibi. Nasıl static normal bir yöntem IntBinaryOperator dönüştürülür?

CEVAP
15 Kasım 2013, Cuma


Genellikle, bir reduce yöntem aşağıdaki gibidir: Math.max(int, int) kullanma der

reduce(new IntBinaryOperator() {
    int applyAsInt(int left, int right) {
        return Math.max(left, right);
    }
});

Şimdi sadece Math.max çağırmak için sözdizimi gerektirir. Lambda ifadeleri devreye girer. Java 8 günden çok daha kısa bir şekilde aynı şeyi yapmak için izin verilir:

reduce( (int left, int right) -> Math.max(left, right) );

Nasıl oluyor bu iş? Java derleyici "intve bir s verir iki int. kabul yöntemi uygulamak istiyor musunuz?", algılar Bu resmi parametreleri ve arabirimi sadece yöntem eşdeğerdir IntBinaryOperator (yöntemin parametre reduce aramak istiyorsun). Derleyici sizin için geri kalanı yok - sadece IntBinaryOperator uygulamak istediğiniz varsayar.

Ama Math.max(int, int) kendini IntBinaryOperator, biçimsel gereklerini yerine getirmiş olarak doğrudan kullanılabilir. Şimdi java yok herhangi bir sözdizimi sağlayan bir yöntem kendisi için bir argüman olarak (tek geçiş yöntemi sonuçlar, ama asla yöntemleri kendisi), :: sözdizimi tanıtıldı Java 8 için başvuru yöntemleri:

reduce(Math::max);

Bu çalışma zamanında JVM tarafından değil, derleyici tarafından yorumlanacak unutmayın! Ancak ürettiği farklı bytecodes için üç kod parçacıkları, onlar anlamsal eşit, bu yüzden son iki olarak kabul edilebilir olması için kısa (ve muhtemelen daha verimli) sürümleri IntBinaryOperator uygulama yukarıda!

(23**)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • fireflame65

    fireflame65

    27 Mart 2007
  • tsweeney79

    tsweeney79

    21 Ocak 2008

İLGİLİ SORU / CEVAPLAR