2016-03-30 24 views
6

Come posso utilizzare la variabile non finale in Java 8 lambda. Si getta errore di compilazione dicendo 'data variabile locale definita in un ambito di inclusione deve essere definitiva o effettivamente finale'Come utilizzare la variabile non finale in Java 8 Lambdas

Io in realtà voglio raggiungere il seguente

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

Come faccio a raggiungere questo obiettivo? Genera errore di comilizzazione per data2. Grazie,

+0

A proposito, le vecchie e fastidiose classi data-ora come ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date. html) sono ora [legacy] (https://en.wikipedia.org/wiki/Legacy_system), soppiantati dal [java.time] (https://docs.oracle.com/javase/9/docs/api/ java/time/package-summary.html) classi integrate in Java 8 e 9. Vedi [Tutorial di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). Potresti essere interessato alle classi 'Periodo' e' Durata'. –

risposta

11

Utilizzare un'altra variabile che è possibile avviare una volta.

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

Penso che si dovrebbe solo ottenere il date2 param esterno e quindi chiamando il metodo getTotal, proprio come questo qui sotto:

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

Cosa succede se il metodo viene chiamato dall'esterno della classe? –

+0

Creare un altro metodo per combinare le due funzioni, uno sta ottenendo il risultato di param2, un altro sta ottenendo il risultato finale per param1 e data2. E possiamo chiamare il nuovo metodo dall'esterno della classe – Tony

0

Basta aggiungere una linea come

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

destra prima il tuo lambda e utilizzare date3 al posto di date2.