2016-03-30 8 views
6

Как использовать не конечную переменную в Java 8 lambda. Он бросает ошибку компиляции говоря «Локальная дата переменной, определенной в рамках ограждающей должен быть окончательным или эффективно окончательным»Как использовать не последнюю переменную в Java 8 Lambdas

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

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. Спасибо,

+0

Кстати, неприятные старые классы времени, такие как ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date. html) теперь [legacy] (https://en.wikipedia.org/wiki/Legacy_system), вытесненный [java.time] (https://docs.oracle.com/javase/9/docs/api/ java/time/package-summary.html), встроенные в Java 8 и 9. См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). Вас могут интересовать классы «Период» и «Длительность». –

ответ

11

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

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

Я думаю, вы должны просто получить пары 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); 
} 
+0

Что делать, если метод вызывается извне класса? –

+0

Создайте другой метод для объединения двух функций: один получает результат param2, другой получает окончательный результат по параметру date1 и date2. И мы можем вызвать новый метод из внешнего класса – Tony

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^