2017-06-14 80 views
24

Sadece bu "hata" ile karşılaştı, ama bu amaçlanıyorsa emin değilim: Kodu: İlk örnekte someMethod yılındaNeden invokeLater ana iş parçacığında yürütülür?

public static Object someMethod(){ 
    assert SwingUtilities.isEventDispatchThread(); 
    return new Object(); 
} 

public static void main(String[] args){ 
    SwingUtilities.invokeLater(() -> someMethod().toString());//First Example 
    SwingUtilities.invokeLater(someMethod()::toString);//Second Example 
} 

salıncak Konu üzerinde yürütülmektedir, ancak ikinci örnekte o değil, benim düşünceme göre olmalı.

Bu bir hata mıdır, yoksa bu amaçlanmış mı? "Tamam, Salıncak, ben invokeLater sizi istediğini someMethod().toString() olduğunu":

+4

Yöntem başvurusu, uygun bir nesne veya sınıf için ilk bağımsız değişken olarak gereksinim duyuyor gibi görünüyor, onu elde etmenin bir yolu değil, bu nedenle işlem, onaylama işlemini bozan ana iş parçacığında çağrılır. İddia edilmeden, metot, '() -> methodResult.toString()' eşdeğeri olan 'methodResult :: toString' oluşturmak için kullanılır. – Pshemo

+18

Hata nerede? İkinci çağrıda, 'someMethod()' 'ana 'gövdede (böylece,' ana 'iplikte) değerlendirilir ve daha sonra, ortaya çıkan nesnenin' toString' yöntemine bir başvuru 'invokeLater'a geçirilir. '. – RealSkeptic

+4

Ayrıca bkz. [System.out :: println' için eşdeğer lambda ifadesi nedir?] (Https://stackoverflow.com/a/28025717/2711488)… – Holger

cevap

62

Bana öyle ilk satırı demek gibi bir yan

bir yanlış anlama gibi görünüyor. "Tamam, Salıncak, ben invokeLater sizi istediğini yöntemle someMethod() tarafından döndürülen nesnenin yöntem toString() olan": Yani Salıncak bunu

yürütür İkinci satır söylemek gibidir. Şu anda

yürütme am bir someMethod() yöntem Yani sonuç

Sadece (bu durumda invokeLater olarak) bir işlev değerlendirmeden önce Java tüm görüşlerin değerlendirilmesi gerektiğini akılda tutmak bana tamamen mantıklı. İlk durumda Java bir lambda fonksiyonu (bunu gerçekleştirmenin gerek) değerlendirilmesi ve ikinci durumda bunun yüzden o

+0

Sorun şu durumda: Neden java, 'SwingUtilities.invokeLater (bu :: birYöntem() toString.); '? – RoiEX

+11

Orada birkaç hata yapıyorsunuz. Bunu statik bir bağlamda kullanamayacağınızı unutmayın. Ayrıca, yöntem referansı kullanıyorsanız, metod isminden sonra '()' yazmayın (yani bu :: someMethod' olacaktır). Son olarak, Java 8 yöntem referansına izin verir, ancak kullanmaya çalıştığınız şey, bir yöntem referansı (ki buna izin verilmez) sonucunda nesne üzerinde bir yöntem çağırmaktır. – Pelocho

+7

Özetleme, birden fazla yöntemi çağırmanız gerekirse, lambda işlevi – Pelocho

8

Bu Salıncak ilgili değil olduğunu yürütmek için gereken bir yöntem başlatmaya karşılaştığında Yani, ne var Yöntem referansları ve sahne arkasındaki lambdas kullanılırken olur.

Daha basit bir örnek:

public static void main(String[] args) { 
    Stream.of(1, 2, 3).map(initMapper()::inc); 

    Stream.of(1, 2, 3).map(x -> initMapper().inc(x)); 
} 

private static Mapper initMapper() { 
    System.out.println("init"); 
    return new Mapper(); 
} 

static class Mapper { 

    public int inc(int x) { 
     return x + 1; 
    } 
} 

Burada tek init çıktı alacak; Akım için herhangi bir terminal çalışması olmadığını fark eder.