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

时间:2016-03-30 11:31:59

标签: java lambda java-8 final

如何在Java 8 lambda中使用非final变量。它会抛出编译错误,说明在封闭范围内定义的局部变量日期必须是最终的或有效的最终版本'

我实际上想要实现以下

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 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:1)

我认为你应该把param 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);
}

答案 2 :(得分:0)

只需添加一行

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

在你的lambda之前,用date3代替date2

答案 3 :(得分:0)

这应该会有所帮助。

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

答案 4 :(得分:0)

使用日期数组用于 lambda

    Map<Integer, String> map = new HashMap<>();
    map.put(9, "3");
    map.put(3, "9");
    String result = map.get(x);
    return result == null ? "not valid" : result;

与非数组解决方案相比,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); } 甚至可以在非并行流中更改。