SORU
21 Mart 2014, Cuma


Java 8 akarsu'ler .(dk) ve .() max: neden bu derleme?

Not: bu soru bir önceki KADAR sorusu olan ölü bir link kaynaklanır, ama işte söylüyorum

Bu kod (not: bu kodu olmayacağını biliyorum "Integer::compare -- kullanılması gereken" ve sadece bağlantılı soru) çıkarılan iş:

final ArrayList <Integer> list 
    = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());

System.out.println(list.stream().max(Integer::max).get());
System.out.println(list.stream().min(Integer::min).get());

.min() .max(), javadoc göre her iki bağımsız değişken Comparator olmalıdır. Henüz burada yöntemi referanslar Integer sınıf statik yöntemler vardır.

Neden bu derleme?

CEVAP
21 Mart 2014, Cuma


Belli değil, çünkü burada neler olduğunu açıkla!

İlk olarak, [Stream.max()] kabul eder örneği Comparator böylece öğeler akışı karşılaştırır karşı birbirlerini bulmak için minimum ya da maksimum, bazı optimal için bu hiç gerek yok, çok fazla endişe hakkında.

Soru, tabii ki, neden Integer::max kabul etti? Sonuçta bir karşılaştırma değil!

Cevap yeni lambda işlevleri Java 8'de çalışır. Gayri resmi "arayüzleri, ya da" SAM "arabirimleri." soyut tek yöntem olarak bilinen bir kavram dayanır Ana fikir, bir soyut yöntem ile herhangi bir arabirim otomatik olarak arayüzünde bir yöntem için bir maç olan lambda - veya referans yöntemi ile uygulanabilir. Yani Comparator arabirim (basit sürüm) incelenmesi:

public Comparator<T> {
    int compare(T o1, T o2);
}

Eğer bir yöntem ** 14, sonra arıyorsa aslında bu imza arıyor:

int xxx(Integer o1, Integer o2);

Kullanıyorum "" . xxx ^strong>yöntem adı eşleşen bir amaç için kullanılamaz, çünkü.

Bu nedenle, Integer.min(int a, int b) Integer.max(int a, int b) hem autoboxing bu bir yöntem Comparator<Integer> içerik olarak görünmesini sağlayacak yeterince yakın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ammine Getahun

    Ammine Getah

    21 HAZİRAN 2011
  • Day9TV

    Day9TV

    22 NİSAN 2010
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007