Wenn Sie die erweiterte for-Anweisung und für jede Anweisung normal deklarieren, lautet sie wie folgt. Da es nicht als "endgültig" deklariert ist, kann es neu zugewiesen werden (normale "for" -Anweisungen werden übersprungen, da eine Neuzuweisung im Prinzip wesentlich ist).
List<Integer> intList = Arrays.asList(1, 2, 3, 4);
for(int i : intList) {
i = 0; //Kann umgeschrieben werden
}
intList.forEach(it -> {
it = 0; //Kann umgeschrieben werden
});
In diesem Artikel werden wir diese Inhalte in eine nicht neu zuweisbare Form umschreiben.
Sie können es "unveränderlich" machen, indem Sie es mit "final" deklarieren.
for(final int i : intList) {
i = 0; //Da es als endgültig deklariert ist, kann es nicht neu zugewiesen werden und es tritt ein Kompilierungsfehler auf.
}
Sie können das Argument "final" setzen, indem Sie den Typ wie unten gezeigt in Klammern angeben.
intList.forEach((final int it) ->
it = 0; //Da es als endgültig deklariert ist, kann es nicht neu zugewiesen werden und es tritt ein Kompilierungsfehler auf.
);
Derzeit kann das Argument auch dann endgültig sein, wenn es als anonyme Klasse implementiert wird.
Consumer<Integer> finalConsumer = new Consumer<Integer>() {
@Override
public void accept(final Integer it) {
it = 0; //Da es als endgültig deklariert ist, kann es nicht neu zugewiesen werden und es tritt ein Kompilierungsfehler auf.
}
};
Als dieser Artikel zum ersten Mal veröffentlicht wurde, lautete der Titel und Inhalt "** Indizes können nur für erweiterte Anweisungen in for-Anweisungen, erweiterte Anweisungen für Anweisungen und forEach-Anweisungen ** unveränderlich gemacht werden", aber @ saka1029 wies darauf hin. Wie Sie sehen, war dies ein Fehler, daher habe ich sowohl den Titel als auch den Inhalt komplett neu geschrieben.
Vielen Dank für den Hinweis auf @ saka1029.
Recommended Posts