1. ホーム
  2. java

[解決済み] ラムダ式で使用する変数はfinalまたはeffective finalでなければならない

2022-04-15 02:16:27

質問

<ブロッククオート

ラムダ式で使用する変数はfinalかeffectly finalでなければならない。

を使おうとすると 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;
}

解決方法は?

A final 変数は、一度だけインスタンス化できることを意味します。 Javaでは、ラムダや匿名の内部クラスでは、最終的でないローカル変数を再割り当てすることはできません。

古い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 を返しますか?

また、これらのヒントがあなたの改善に役立つことを願っています。