【问题标题】:How to use non final variable in Java 8 Lambdas如何在 Java 8 Lambda 中使用非最终变量
【发布时间】:2016-03-30 11:31:58
【问题描述】:

如何在 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 的编译错误。 谢谢,

【问题讨论】:

标签: java lambda java-8 final


【解决方案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();
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果从类外调用方法怎么办?
      • 创建另一个方法来组合这两个函数,一个是获取param date2的结果,另一个是获取param date1和date2的最终结果。我们可以从外部类调用新方法
      【解决方案4】:

      只需添加一行

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

      在您的 lambda 之前使用 date3 代替 date2

      【讨论】:

        【解决方案5】:

        使用一个日期数组在lambda中使用

        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] 甚至可以在非并行流中更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-08
          • 1970-01-01
          • 2012-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-01
          • 1970-01-01
          相关资源
          最近更新 更多