当前位置: 首页 > 知识库问答 >
问题:

如何在Java8 Lambda中使用非最终变量

宋昕
2023-03-14

如何在Java 8 lambda中使用非final变量。它抛出编译错误,称“封闭范围中定义的局部变量日期必须是final或实际上是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 引发 comilation 错误。谢谢

共有3个答案

倪风史
2023-03-14

我认为您应该只在外部获取参数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);
}
花博厚
2023-03-14

这应该是有帮助的。

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();
}
郭弘方
2023-03-14

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

final Date tmpDate;
if(date2 == null || a few more conditions) {
    tmpDate = someOtherDate;
} else {
    tmpDate = date2;
}
 类似资料:
  • 问题内容: 我试图通过执行程序和可运行程序并行执行100个任务,该任务需要使用循环变量: 我在“我”的语气中a不休- 据我所知,由于每次迭代都会更改循环变量,因此无法使其成为最终变量或有效地成为最终变量。我找到了一个简单的解决方法, 在我看来,这并不是最有效的解决方案,因为每次迭代都要声明一个新变量。有更好的方法吗? 问题答案: 有更好的方法吗? 我对此表示怀疑。您的解决方案对我来说看起来不错,但

  • 在此代码示例中,ActionListener的actionPerformed函数中没有使用最终对象jLabel:

  • 问题内容: 我想知道使用最终局部变量是否有可用性。当继承出现时,变量无论如何都不会被覆盖。例如下面的简单代码 这个例子很简单,可能不是一个相关的代码,但是问题比较笼统。我已经看到了很多代码(全部都包含在具有最终局部变量的main函数中)是否有将局部变量声明为final other的可用性。不能在同一功能中进行编辑? 问题答案: 首先,关于变量被“覆盖”的部分具有两个非常不同的含义。对于类和方法,它

  • 问题内容: 我从来没有适当地理解finally语句的用法。谁能告诉我有什么区别: 一方面并: 在另一 问题答案: 他们不同,如​​果 在-块完成了由投掷不是一个,例如,因为它是一个如或。 在try块突然结束使用流程控制语句这样的,或 catch块突然完成(通过抛出任何throwable或使用控制流语句) 更一般而言,Java语言保证在try语句完成之前执行finally块。(请注意,如果try语句

  • 问题内容: 我之前问过这个问题,但没有得到适当的答案。 如果非最终字段的值可以更改,那么如何在非匿名字段类中使用非最终字段? 如果必须在匿名类中使用局部变量,以使编译器可以在匿名类代码中内联其值,如下所示: 之前: 后: 和 那么 ,编译器如何内联非final字段的值? 问题答案: 方法调用的局部变量(内部类必须可以访问)和实例的私有数据成员之间有很大的区别。 内部类可以访问包含的实例,也可以访问

  • 库加载良好,但似乎找不到静态变量。为什么没有加载静态变量?