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
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.
"döngü:" Java kodu. Bu nedir...
Neden bu Java 8 program derleme değil ...
Neden derleme zamanında bind değişkenl...
Eclipse, Java kaynakları hatasız derle...
Neden char[] şifreler için Dize Java t...