Java Language Lambdas et utilisation de la mémoire


Exemple

Comme les lambdas Java sont des fermetures, ils peuvent "capturer" les valeurs des variables dans la portée lexicale. Bien que tous les lambda ne capturent rien - de simples lambda comme s -> s.length() ne capturent rien et s'appellent sans état - la capture de lambdas nécessite un objet temporaire pour contenir les variables capturées. Dans cet extrait de code, le lambda () -> j est un lambda de capture et peut provoquer l’allocation d’un objet lorsqu’il est évalué:

public static void main(String[] args) throws Exception {
    for (int i = 0; i < 1000000000; i++) {
        int j = i;
        doSomethingWithLambda(() -> j);
    }
}

Bien que cela ne soit pas immédiatement évident puisque le new mot-clé n'apparaît nulle part dans le fragment, ce code est susceptible de créer 1 000 000 000 d'objets séparés pour représenter les instances de l'expression () -> j lambda. Cependant, il convient également de noter que les futures versions de Java 1 pourraient être en mesure de l’optimiser, de sorte que lors de l’exécution, les instances lambda soient réutilisées ou représentées d’une autre manière.


1 - Par exemple, Java 9 introduit une phase facultative de "lien" à la séquence de compilation Java, ce qui permettra de réaliser de telles optimisations globales.