Je comprends cela comme une partie standard de la programmation fonctionnelle .. ma question est de savoir pourquoi le compilateur ne peut pas automatiquement déclarer une copie de la variable comme finale juste avant le début de l'instruction lambda?Java: pourquoi java ne peut pas "finaliser" automatiquement les variables locales dans la portée englobante de l'expression lambda?
import java.util.stream.IntStream;
public class Example
{
public static void main(String args[])
{
int i = 5;
i = 6;
IntStream.range(0, 10).mapToLong(j-> i * j).sum();
}
}
échoue ... avec « Variable locale i définie dans un champ englobante doit être définitive ou efficace finale » alors qu'il semble que le compilateur devrait être assez intelligent pour faire quelque chose comme ça
import java.util.stream.IntStream;
public class Example
{
public static void main(String args[])
{
int i = 5;
i = 6;
final int _i = i;
IntStream.range(0, 10).mapToLong(j-> _i * j).sum();
}
}
la compilateur pourrait appliquer que la variable finalisée est jamais modifiée par la fonction lambda
Il pourrait; cela rendrait le code plus difficile à raisonner. –
Serait plus difficile à utiliser et à comprendre dans les scénarios multithread (qui bénéficient également de finales). –
@AdamKotwasinski comment le multi-threading peut-il changer quelque chose? Je ne propose pas que la fonction lambda soit capable de modifier des variables dans sa portée parente. – crow