Le message d'erreur "La variable utilisée dans l'expression lambda doit être finale ou effectivement finale" apparaît lors de la tentative d'utilisation d'une variable non finale. variable dans une expression lambda. Cette exigence garantit l'immuabilité de la variable capturée.
Dans l'extrait de code fourni :
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { ... cal.getComponents().getComponents("VTIMEZONE").forEach(component -> { ... if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } }); ... }
La variable calTz est utilisée dans l'expression lambda et n'a pas de statut final garanti. Cela viole la règle selon laquelle les expressions lambda ne peuvent capturer que des variables finales ou effectivement finales.
Pourquoi cette règle est-elle en place ? La spécification du langage Java (JLS) explique au §15.27.2 qu'elle empêche l'accès aux variables locales à changement dynamique, atténuant ainsi les problèmes de concurrence. En garantissant que les variables capturées sont immuables, le langage réduit le risque de bugs.
Cette exigence s'applique également aux classes internes anonymes. Les variables utilisées dans ces classes doivent également être finales ou effectivement finales pour garantir la sécurité des threads.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!