Как использовать не финальную переменную в Java 8 Lambdas

Как я могу использовать не финальную переменную в Java 8 лямбда. Он выдает ошибку компиляции, говорящую "Дата локальной переменной, определенная во вложенной области видимости, должна быть окончательной или фактически окончательной"

Я на самом деле хочу добиться следующего

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

Как мне этого добиться? Выдает ошибку компиляции для date2. Спасибо,

5 ответов

Используйте другую переменную, которую вы можете инициировать один раз.

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

Это должно быть полезно.

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

Я думаю, что вы должны просто получить параметр date2 снаружи и затем вызвать метод getTotal, как показано ниже:

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

Просто добавьте строку как

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

прямо перед вашей лямбда и использовать date3 на месте date2,

используйте массив дат для использования в лямбда

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

В отличие от решения без массива, date[0]может быть изменен даже в непараллельном потоке.

Другие вопросы по тегам