Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use non final variable in Java 8 Lambdas

How can I use non-final variable in Java 8 lambda. It throws compilation error saying 'Local variable date defined in an enclosing scope must be final or effectively final'

I actually want to achieve the following

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

How do I achieve this? It throws comilation error for date2. Thanks,

like image 339
vaibhavvc1092 Avatar asked Mar 30 '16 11:03

vaibhavvc1092


3 Answers

Use another variable that you can initiate once.

final Date tmpDate;
if(date2 == null || a few more conditions) {
    tmpDate = someOtherDate;
} else {
    tmpDate = date2;
}
like image 78
Yassin Hajaj Avatar answered Sep 28 '22 06:09

Yassin Hajaj


This should be helpful.

public Long getTotal(Date date1, Date date2) {
    final AtomicReference<Date> date3 = new AtomicReference<>();
    if(date2 == null ) {
        date3.getAndSet(Calendar.getInstance().getTime());
    }
    return someList.stream().filter(x -> date1.equals(date3.get())).count();
}
like image 29
Vinayak Dornala Avatar answered Sep 28 '22 07:09

Vinayak Dornala


I think you should just get the param date2 outside and then calling the method getTotal, just like this below:

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);
}
like image 31
zhouxin Avatar answered Sep 28 '22 06:09

zhouxin