在lambda表达式中使用的变量应该是最终变量或有效的最终变量。

在lambda表达式中使用的变量应该是最终变量或有效的最终变量。

在lambda表达式中使用的变量应该是最终变量或有效的最终变量。

当我试图用calTz它显示了这个错误。

private TimeZone extractCalendarTimeZoneComponent(Calendar cal,TimeZone calTz) {
    try {
       cal.getComponents().getComponents("VTIMEZONE").forEach(component->{
        VTimeZone v = (VTimeZone) component;
           v.getTimeZoneId();
           if(calTz==null) {
               calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());
           }
           });
    } catch (Exception e) {
        log.warn("Unable to determine ical timezone", e);
    }
    return null;}


人到中年有点甜
浏览 4918回答 3
3回答

MMTTMM

A final变量意味着它只能被实例化一次。在Java中,您不能在lambda和匿名内部类中使用非最终变量。您可以使用旧的for-each循环重构代码:private TimeZone extractCalendarTimeZoneComponent(Calendar cal,TimeZone calTz) {     try {         for(Component component : cal.getComponents().getComponents("VTIMEZONE")) {         VTimeZone v = (VTimeZone) component;            v.getTimeZoneId();            if(calTz==null) {                calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());            }         }     } catch (Exception e) {         log.warn("Unable to determine ical timezone", e);     }     return null;}即使我不明白这段代码的含义:你叫.v.getTimeZoneId();而不使用其返回值带着任务calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());您不会修改最初传递的calTz而且你没有在这个方法中使用它你总是回来null,你为什么不void作为返回类型?希望这些建议也能帮助你提高。

德玛西亚99

虽然其他答案证明了这一要求,但他们没有解释为什么这种要求是存在的。JLS提到了为什么第15.27.2节:对有效的最终变量的限制禁止访问动态变化的局部变量,这些局部变量的捕获可能会带来并发问题。为了降低bug的风险,他们决定确保捕获的变量不会发生变异。

蝴蝶刀刀

从lambda中,您无法获得对任何不是最终结果的引用。您需要从Lamda外部声明一个最后的包装器来保存您的变量。我添加了最后的“引用”对象作为这个包装器。private&nbsp;TimeZone&nbsp;extractCalendarTimeZoneComponent(Calendar&nbsp;cal,TimeZone&nbsp;calTz)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;AtomicReference<TimeZone>&nbsp;reference&nbsp;=&nbsp;new&nbsp;AtomicReference<>(); &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal.getComponents().getComponents("VTIMEZONE").forEach(component->{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VTimeZone&nbsp;v&nbsp;=&nbsp;(VTimeZone)&nbsp;component; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.getTimeZoneId(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(reference.get()==null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference.set(TimeZone.getTimeZone(v.getTimeZoneId().getValue())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//log.warn("Unable&nbsp;to&nbsp;determine&nbsp;ical&nbsp;timezone",&nbsp;e); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;reference.get();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java