2016-03-30 10 views
6

Wie kann ich nicht endgültige Variable in Java 8 Lambda verwenden. Es wirft Fehler Kompilation ‚Local Variable Datum definiert in einem umschließenden Rahmen sein muss endgültig oder effektiv final‘ sagenWie benutze ich nicht endgültige Variable in Java 8 Lambdas

ich eigentlich die folgende

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

Wie kann ich das erreichen zu erreichen? Es wird ein Comilationsfehler für date2 ausgelöst. Danke,

+0

Übrigens, die lästigen alten Datum-Zeit-Klassen wie ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date. html) sind nun [legacy] (https://en.wikipedia.org/wiki/Legacy_system), ersetzt durch [java.time] (https://docs.oracle.com/javase/9/docs/api/ java/time/package-summary.html) Klassen, die in Java 8 & 9 integriert sind. Siehe [Tutorial von Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). Möglicherweise interessieren Sie sich für die Klassen "Zeitraum" und "Dauer". –

Antwort

11

Verwenden Sie eine andere Variable, die Sie einmal initiieren können.

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

Ich denke, Sie sollten nur die param date2 außerhalb bekommen und dann die Methode getTotal Aufruf, so wie dies unter:

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

Was passiert, wenn die Methode von außerhalb der Klasse aufgerufen wird? –

+0

Erstellen Sie eine andere Methode, um die beiden Funktionen zu kombinieren, eine erhält das Ergebnis von param date2, eine andere erhält das endgültige Ergebnis von param date1 und date2. Und wir können die neue Methode von außerhalb der Klasse nennen – Tony

0

Fügen Sie einfach eine Zeile wie

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

Recht vor Ihr Lambda und verwenden date3 anstelle von date2.

Verwandte Themen