2016-03-30 32 views
6

Java 8 lambda'da son olmayan değişkeni nasıl kullanabilirim? O 'olmalı kapatıcı bir alanda tanımlı Yerel değişken tarih nihai veya etkin bir şekilde nihai' diyerek derleme hatası atarJava 8'de son olmayan değişken nasıl kullanılır Lambdas

Aslında

public Integer getTotal(Date date1, Date date2) { 
    if(date2 == null || a few more conditions) { 
     date2 = someOtherDate; 
    } 
    return someList.stream().filter(filter based on date1 and date2).map(Mapping Function).reduce(Addition); 
} 

Bunu nasıl elde edebilirim aşağıdaki elde etmek istiyorum

? Date2 için yazım hatası atar. Teşekkür ederiz,

+0

Bu arada, ['java.util.Date'] gibi sıkıntılı eski tarih-zaman sınıfları (https://docs.oracle.com/javase/9/docs/api/java/util/Date. html) [java.time] (https://docs.oracle.com/javase/9/docs/api/ Java 8 & 9'a yerleşik java/time/package-summary.html) sınıfları. Bkz. [Oracle Öğreticisi] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). 'Dönem' ve 'Süre' sınıflarıyla ilgilenebilirsiniz. –

cevap

11

Bir kez başlatabileceğiniz başka bir değişken kullanın.

final Date tmpDate; 
if(date2 == null || a few more conditions) { 
    tmpDate = someOtherDate; 
} else { 
    tmpDate = date2; 
} 
1

Sadece bu gibi aşağıda, sadece yöntem getTotal çağırarak dışında ve sonra param Date2 almak gerektiğini düşünüyorum:

Date date1; 
Date date2; 

if(date2 == null || a few more conditions) { 
    date2 = someOtherDate; 
} 

getTotal(date1, date2) 


public Integer getTotal(Date date1, Date date2) { 
    return someList.stream().filter(filter based on date1 and date2).map(Mapping Function).reduce(Addition); 
} 
+0

Yöntem, sınıfın dışından çağrılırsa ne olur? –

+0

İki işlevi birleştirmek için başka bir yöntem oluşturun, biri param date2 sonucunu alıyor, diğeri son sonucu param date1 ve date2 ile alıyor. Ve yeni yöntemi dış sınıftan arayabiliriz – Tony

0

Hemen hemen önce

Date date3 = date2; // date3 is effectively final in Java 8. Add 'final' keyword in Java 7. 

gibi bir satır eklemek Senin lambda ve date2 yerine date3 kullanın.