Maison >Java >javaDidacticiel >Les Lambdas Java peuvent-ils être sérialisés et comment pouvons-nous les rendre sérialisables ?

Les Lambdas Java peuvent-ils être sérialisés et comment pouvons-nous les rendre sérialisables ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-22 09:29:28320parcourir

Can Java Lambdas Be Serialized, and How Can We Make Them Serializable?

Les lamdas peuvent-ils être sérialisés ?

Les lambdas Java ne sont pas intrinsèquement sérialisables, ce qui signifie qu'ils ne peuvent pas être directement écrits dans un flux et relus ultérieurement. Cela peut poser un défi lorsque l'on tente de persister ou de transmettre des lambdas dans différents contextes.

L'énigme de la sérialisation

Considérez l'extrait de code suivant :

public static void main(String[] args) throws Exception {
    File file = Files.createTempFile("lambda", "ser").toFile();
    try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
        Runnable r = () -> System.out.println("Can I be serialized?");
        oo.writeObject(r);
    }

    try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
        Runnable r = (Runnable) oi.readObject();
        r.run();
    }
}

Lorsque vous tentez de sérialiser le lambda lambda dans le code ci-dessus, une NotSerializingException est levée. En effet, les lambdas, par défaut, ne sont pas sérialisables en Java.

Sérialisation Lambda élégante

Pour résoudre ce problème et activer la sérialisation lambda, nous pouvons tirer parti de l'intersection de types fonctionnalité introduite dans Java 8. Cela nous permet de spécifier plusieurs limites pour un transtypage, transformant efficacement le lambda en un objet qui implémente à la fois les fonctions Runnable et Serialisable. interfaces.

Voici le code mis à jour qui résout élégamment le défi de la sérialisation :

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");

Avec cette solution en place, le lambda peut désormais être écrit de manière transparente dans le flux d'objets, conservé dans le fichier système, puis désérialisé et exécuté, sans aucune erreur ni exception.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn