Ok operatörü '->' Java'da ne yapar?


171

Bazı kodları araştırırken ok operatörüne rastladım, tam olarak ne yapıyor? Java'nın ok operatörü olmadığını düşündüm.

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

Ayrıntılar : Java 6, Apache Commons Koleksiyonu, IntelliJ 12

Güncelleme / Yanıt: IntelliJ 12'nin lambdas'ı destekleyen Java 8'i desteklediği ve "katlandığı" anlaşılıyor ve bunları lambdas olarak gösteriyor. Aşağıda "katlanmamış" kod bulunmaktadır.

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

5
Kesin senaryo IntelliJ unutmayın render okumayı kolaylaştırmak için bir lambda ifadesi olarak mevcut kodu. Gerçek kod bir lambda ifadesi değildir.
Thorbjørn Ravn Andersen

Yanıtlar:


125

Bu, Java 8'de tanıtılacak yeni lambda ifadelerinin sözdiziminin bir parçası. Bunu asmak için birkaç çevrimiçi öğretici var, işte bunlardan birine bir bağlantı . Temel olarak, ->parametreleri (sol taraf) uygulamadan (sağ taraf) ayırır.

Lambda ifadelerinin kullanımı için genel sözdizimi

(Parametreler) -> {Body} burada '->' parametreleri ve lambda ifade gövdesini ayırır.

Parametreler, yöntemlerle aynı şekilde parantez içine alınır ve lambda ifade gövdesi, parantez içine alınmış bir kod bloğudur.


10
JDK 6 kullanan OP, bu yüzden aşağıdaki @antonm cevabına göre gerçekten sadece IntelliJ katlama kodu
Sean Landsman

6
@SeanLandsman OP Java 6 kullanıyor olabilir, ancak soruda başka bir yerde bu kodla karşılaştığını belirtiyor. IntelliJ bir sır bir hata raporlama değil neden olarak (belki orada olduğunu OP'ın sistemde bir yerlerde takılı bir Java 7 versiyonu). Ama bu bir lambda ifadesinin Java'daki sözdizimi, bununla ilgili bir soru yok.
Lópezscar López

38

Bu, işlevsel bir arayüz uygulamak istediğinizde de yararlıdır

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

eşittir

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

bu özellik neden sunuluyor?
Akaisteph7

1
@ Akaisteph7 bir yöntem tanımlamak istemediğinizde, yalnızca bir arayanın bu yöntemi çağırdığını görürsünüz. Bu durumlarda, yöntemi ayrı bir yerde tanımlamak DEĞİL mantıklıdır, daha ziyade yöntemin gövdesine geçilir, anonim yöntem ve ardından lambda okunur.
Vivek Shukla

30

İnanıyorum ki, bu ok IDE'niz yüzünden var. IntelliJ IDEA bazı kodlarla böyle bir şey yapar. Buna kod katlama denir. Genişletmek için oku tıklayabilirsiniz.


36
@DavidConrad Hayır, yanlış değil. IntelliJ aslında lambdalara benzemek için fonksiyonel arayüzlerin satır içi uygulamalarını katlıyor.
balpha

12
Şu soruya bakın: "Ayrıntılar: Java 6, Apache Commons Koleksiyonu, IntelliJ 12" Java 6'da Lambda ???
Anton-M

13

Bu bir lambda ifadesi.

Bu listOfCars listesinden arg0'ın bu listenin öğelerinden biri olduğu anlamına gelir. O eşya ile yapacak, dolayısıyla ->, parantez içinde ne varsa.

Bu örnekte, duruma uyan araçların bir listesini döndürecek

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.