Soru Java kapatma giriş


Java kapanışını anlamak için lütfen bu tür bir kodu açıklayınız.

public static <T> void sort(List<T> l, final {T, T=>Number} block) {

    Collections.sort(l, new Comparator<T>() {
        public int compare(T arg0, T arg1) {
            return block.invoke(arg0, arg1);
        }
    }
}

19
2018-05-26 10:22


Menşei


Java 7'de kapatma yok. Kapaklar için destek, Java 8'e ertelendi. - axtavt
Teknik olarak iç sınıflar kapanır (bir kapsamın tanımlayıcılarına erişim ile işlevler tanımlar). Java 7'nin sahip olmadığı şey zarif kapanışları. - Luke Usherwood


Cevaplar:


Önemli Not: Soru bir önceki ile ilgili idi öneri. Bu seçilen sözdizimi değildi. Bu Q / A'yı "geçmiş referans" olarak görün.


Bu sözdizimi BGGA-öneri Gilad Bracha, Neal Gafter, James Gosling ve Peter von der Ahé.

Bu kod pasajı aşağıdaki gibi tanımlanabilir:

  1. İkinci argüman olarak parametreleri alan bir fonksiyon alır. (T, T) ve geri dönüyor Number (ve onu parametreye atar block)

  2. Sonra bir oluşturur Comparator<T> Bunun dışında. Bu uygulayarak yapar compare bir çağrıya aktararak block.

  3. Bu karşılaştırıcıyı geçer. Collections.sort yöntem.


İşte sözdiziminin bir kopuşu geliyor:

public static <T> void sort(List<T> l, final {T, T=>Number} block) {
                                             ^^^^^^^^^^^^^^^^^^^^

Denilen bir argüman block hangi tür "iki tane çeken işlev T ve bir döndürür Number".

    Collections.sort(l, new Comparator<T>() {
        public int compare(T arg0, T arg1) {
            ...
        }
    }
}

Sıradan bir çağrı Collections.sort anonim bir alt sınıf örneği ile Comparator ikinci argüman olarak ...

        ...
            return block.invoke(arg0, arg1);
        ...

... tarafından tanımlanan işlev tarafından hesaplanan sayıyı döndürür. block argüman.


Klasik Java’ya göre, snippet’iniz

interface Block<T> {
    public int invoke(T arg1, T arg2);
}


class Test {
    public static <T> void sort(List<T> l, final Block<T> block) {
        Collections.sort(l, new Comparator<T>() {
            public int compare(T arg0, T arg1) {
                return block.invoke(arg0, arg1);
            }
        });
    }
}

30
2018-05-26 10:28



saman! Onun gerçekten iyi bir türevi - Subhrajyoti Majumder
Java'ya sahip olmak için sabırsızlanıyorum. Gözlerimden bıktım ... Gözlerimdeki olay () yöntemleri. - Jakub Zaverka
Lambdaların son durumunun iyi bir açıklaması için, bir göz atın. cr.openjdk.java.net/~briangoetz/lambda/... - Bringer128


@Axtavt'un işaret ettiği gibi, Java 7 (maalesef) kapanmayacak. Ancak Groovy, JVM'de çalışır ve diğer Java kodlarıyla çok güzel bir şekilde bütünleşir. İD okumak Daha fazla bilgi için bu.


4
2018-05-26 10:28