1. ホーム
  2. java

[解決済み] ラムダ内部からローカル変数を変更する

2022-04-23 17:56:09

質問

のローカル変数を変更する。 forEach はコンパイルエラーになります。

通常

    int ordinal = 0;
    for (Example s : list) {
        s.setOrdinal(ordinal);
        ordinal++;
    }

ラムダと

    int ordinal = 0;
    list.forEach(s -> {
        s.setOrdinal(ordinal);
        ordinal++;
    });

この問題を解決する方法はありますか?

どのように解決するのですか?

ラッパーを使用する

どんな包みでもいいんです。

Java 10以上 この構成は非常に簡単に設定できるので、ぜひ使ってみてください。

var wrapper = new Object(){ int ordinal = 0; };
list.forEach(s -> {
  s.setOrdinal(wrapper.ordinal++);
});

Java 8 以上 のどちらかを使用します。 AtomicInteger :

AtomicInteger ordinal = new AtomicInteger(0);
list.forEach(s -> {
  s.setOrdinal(ordinal.getAndIncrement());
});

...または配列。

int[] ordinal = { 0 };
list.forEach(s -> {
  s.setOrdinal(ordinal[0]++);
});

並列ストリームを使用する場合は、十分に注意してください。期待した結果にならないかもしれません。その他の解決策としては スチュアートの の方が、より適応的かもしれません。

以外のタイプについては int

もちろん、これは他のタイプでも有効です。 int .

例えば Java 10+ :

var wrapper = new Object(){ String value = ""; };
list.forEach(s->{
  wrapper.value += "blah";
});

また、もしあなたが ジャバ8 または 9 の場合、上記と同じような構成になりますが、その際 AtomicReference ...

AtomicReference<String> value = new AtomicReference<>("");
list.forEach(s -> {
  value.set(value.get() + s);
});

...または配列。

String[] value = { "" };
list.forEach(s-> {
  value[0] += s;
});