2012-06-21 32 views
16

Java 8 lambda uygulamasının değişebileceğinin farkındayım, ama lambda build b39'da, sadece lambda ifadesinin boş olmayan bir tip döndürdüğünde parantezlerin atlanabileceğini buldum. Örneğin, bu derler:Java 8 lambda sözdiziminde parantez ne zaman gereklidir?

public class Collections8 { 
     public static void main(String[] args) { 
       Iterable<String> names = Arrays.asList("Alice", "Bob", "Charlie"); 
       names.filter(e -> e.length() > 4).forEach(e -> { System.out.println(e); }); 
     } 
} 

Ama böyle parantez kaldırma:

names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e)); 

hatayı verir

Collections8.java:6: error: method forEach in interface Iterable<T> cannot be applied to given types; 
     names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e)); 
             ^
    required: Block<? super String> 
    found: lambda 
    reason: incompatible return type void in lambda expression 
    where T is a type-variable: 
    T extends Object declared in interface Iterable 

kimse burada neler olduğunu açıklayabilir misiniz?

+1

bile sormak neden değiştirmek geliştirme ve konu halen varsa? Cevap hemen güncel olmayabilir. – user12345613

+10

Çünkü onun arkasındaki mantığı anlamak isterim. – hertzsprung

+1

Filtre yöntemini nereden alırsınız? Java 8 lambda versin var ve yr kodu derlemiyor. – NimChimpsky

cevap

18

Lambda gövdesi tek bir ifade veya boş bir yöntem çağrısı olduğunda parantezleri atlayabilirsiniz. Her ifade bir değer olarak değerlendirilir ve bu nedenle geçersiz olamaz. lambda vücut tabloların bir blok (a return deyimi tarafından takip hesaplamaların örneğin bir dizi), ya da lambda (yani bir void dönüş türü vardır) değeri yoktur ve tek boşluk metot çağrımı değilse

, parantez gerektiren blok formunu kullanmalısınız. bir blok tarzında lambda olarak

bir değer return baskı, bütün olası kod yollarını gerekir return bir değer ya da throw bir Throwable ise.

+1

Bunun OP'nin söylediklerinin tekrarı olduğunu ve bir şeyleri kaçırmadığım sürece talep edilen "neden" i yanıtlamadan bazı ek detaylar eklediğine inanıyorum. –

+0

Sanırım bu benim için bazı şeyleri açıklıyor. İfadeler ifadeler değildir, çünkü değerlendirilemezler. Diş telleri lambda gövdesi bir ifade ise isteğe bağlıdır, ancak vücut bir ifadesi veya ifadeler dizisi ise zorunludur. Bu doğru mu, şaka mı? – hertzsprung

+2

Neredeyse. İfadelerin bir tür ifade (yani, tüm ifadeler ifadelerdir, ancak tüm ifadeler ifadeler değildir) olarak açıklığa kavuşturulmalıdır. Ayrıca bir bloğun ({} 'ile çevrelenen kod) sözdizimsel olarak tek bir ifade olduğunu unutmayın. Bir lambdanın bedeninin, bir ifade veya bir blok ifadesi olabilen tek bir ifade içerdiğini söylemek daha açık olabilir. – jpm

10

Bu sadece EG: (çoğunlukla) sözdizimi konusunda bir karar almıştır.

Bir dizi alternatifi düşündükten sonra, temelde C# sözdizimini benimsemeye karar verdik. Hala numaralı ince noktalarda (örn. Ince ok ve yağ oku, özel nilary form, vb.) Daha fazla harekete geçebiliriz ve henüz metod referansı sözdizimi ile ilgili bir karara varırız.

C# sözdizimi:

lambda = ArgList Arrow Body 
ArgList = Identifier 
      | "(" Identifier [ "," Identifier ]* ")" 
      | "(" Type Identifier [ "," Type Identifier ]* ")" 
Body = Expression 
      | "{" [ Statement ";" ]+ "}" 

bir ifade şeye değerlendirir sen Java boşluk ifadeleri olamaz. Bu bir ifadedir, bu yüzden etrafında {} gerekir. > Operatörü - hayır parantez yoksa

http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html

0

, lambda otomatik ardına ifadesini döndürür.
Böylece, hiçbir şey döndürmeyen bir lambda olduğunuzda,

1

parantezlerini kullanmanız gerekir Kodunuzu denedim ve en güncel JRE sürümü için bunun iyi olacağını düşünüyorum.

Aşağıdakiler, Oracle Java dokümanlarından kaynaklanmaktadır.

Bir lambda ifadesinde, ifadeleri parantez içine almalısınız ({}). Bununla birlikte, parantez içinde geçersiz bir yöntem çağırma işlemi yapmak zorunda değilsiniz.Örneğin
aşağıdaki geçerli bir lambda ifadesidir:

email -> System.out.println(email) 

Ve doktor çok net açıklıyor. Umut, bu sorununuzu çözebilir.

Referanslar: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

İlgili konular