小编典典

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

all

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

阅读 68

收藏
2022-07-08

共1个答案

小编典典

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

即使我不明白这段代码的某些部分:

  • 你调用 av.getTimeZoneId();而不使用它的返回值
  • 使用分配calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());,您不会修改最初传递的calTz,并且您不会在此方法中使用它
  • 你总是返回null,为什么不设置void为返回类型?

希望这些技巧也能帮助你提高。

2022-07-08