如何在 Java 8 Lambdas 中使用非最终变量

2022-09-03 01:34:20

如何在Java 8 lambda中使用非最终变量。它引发编译错误,指出“在封闭范围内定义的局部变量日期必须是最终的或有效的最终日期”

我实际上想实现以下目标

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 引发 comilation 错误。谢谢


答案 1

使用另一个可以启动一次的变量。

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

答案 2

这应该会有所帮助。

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

推荐