94

Bazı kodları avlarken ok operatörüne rastladım, tam olarak ne yapıyor? Java'nın bir ok operatörü olmadığını düşündüm.Ok operatörü '->', Java'da ne yapıyor?

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> { 
     return Car.SEDAN == ((Car)arg0).getStyle(); 
}); 

Detaylar: Java 6, Apache Commons Koleksiyonu, Intellij 12

Güncelleme/Cevap: Bu IntelliJ 12 lambdas destekler Java 8 destekler çıkıyor ve "dir katlanır "onları lambdas olarak tahmin ve gösterir. Aşağıda "katlanmamış" kod. Yeni lambda ifadelerinin sözdizimi, bir parçası

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() { 
    public boolean evaluate(Object arg0) { 
     return Car.SEDAN == ((Car)arg0).getStyle(); 
    } 
}); 
+3

Not eşdeğerdir okumak daha kolay. Gerçek kod bir lambda ifadesi değildir. –

cevap

74

burada link tek tebrik ediyor onu asmak için çevrimiçi öğreticiler bir çift vardır Java 8. devreye sokulacaktır. Temel olarak, -> parametreleri (sol taraf) gerçek ifadeden (sağ taraf) ayırır.

+8

OPK kullanarak JDK 6, bu gerçekten sadece IntelliJ katlama kodu –

+1

@SeanLandsman OP, Java 6 kullanıyor olabilir, ancak soruda o başka bir yerde bu kodu geldiğini belirtiyor. IntelliJ'in neden bir hata bildirmediği konusunda, bu bir gizem (belki de OP sisteminin sisteminde herhangi bir yere kurulmuş bir Java 7 sürümü var). Ama bu Java'da bir lambda ifadesinin sözdizimi, bunun hakkında bir soru yok. –

9

Bu bir lambda ifadesidir.

Bu, listOfCars listesinden arg0 listesinin öğelerinden biri olduğu anlamına gelir. Bu öğe ile, o zaman ->, parantez içinde ne olursa olsun. Bu örnekte

, o koşul inanıyorum

Car.SEDAN == ((Car)arg0).getStyle(); 
26

sığacak arabalarının bir listesini döndürmek için gidiyor, bu ok çünkü IDE bulunmaktadır. IntelliJ IDEA bazı kodlarla böyle bir şey yapar. Bu kod katlama denir. Genişletmek için oku tıklayabilirsiniz. Bir arabirim uygulamak istediğinizde bu bir yanı yararlıdır

+0

daha olasıdır. – irreputable

+9

Bu yanlış. Bu bir Java 8 lambda ifadesi. –

+23

@DavidConrad Hayır, bu yanlış değil. IntelliJ gerçekten de lambda gibi görünmek için fonksiyonel arayüzlerin inline uygulamalarını katlamaktadır. – balpha

8

Runnable r =()-> System.out.print("Run method"); 

kesin senaryo IntelliJ yapmak için bir lambda ifadesi olarak mevcut kod _rendering_ olduğunu

Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       System.out.print("Run method"); 
      } 
     };