2016-03-30 11 views
6

Jak używać zmiennej nieostatniej w Java 8 lambda. Zgłasza błąd kompilacji mówiąc 'lokalna data zmiennej zdefiniowanej w zakresie otaczającego musi być ostateczna lub skutecznie końcowejJak używać zmiennych nierefinalnych w Javie 8 Lambdas

I rzeczywiście chcemy osiągnąć następujące

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); 
} 

Jak to osiągnąć? Wywołuje błąd zwijania dla date2. Dzięki,

+0

Nawiasem mówiąc, kłopotliwe stare klasy czasu i daty, takie jak ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date. html) są teraz starsze (https://pl.wikipedia.org/wiki/Legacy_system), wypierane przez [java.time] (https://docs.oracle.com/javase/9/docs/api/ java/time/package-summary.html) klasy wbudowane w Java 8 i 9. Zobacz [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). Możesz być zainteresowany klasami "Okres" i "Czas trwania". –

Odpowiedz

11

Użyj innej zmiennej, którą możesz zainicjować raz.

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

myślę, że należy po prostu uzyskać date2 param zewnątrz, a następnie wywołanie metoda getTotal, tak jak ten poniżej:

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

Co się stanie, jeśli metoda zostanie wywołana spoza klasy? –

+0

Utwórz kolejną metodę łączenia dwóch funkcji, jedną jest otrzymywanie wyniku daty parametru 2, a druga otrzymuje końcowy wynik według parametru data1 i data2. I możemy nazwać nową metodę z zewnętrznej klasy – Tony

0

Wystarczy dodać linię jak

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

tuż przed twoja lambda i użyj date3 zamiast date2.