In Java programming, it's not uncommon to encounter scenarios where you need to serialize lambda expressions. However, attempts to directly serialize a lambda often result in a NotSerializableException.
Consider the following example:
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(); } }
In this case, serializing the lambda throws a NotSerializableException.
To overcome this challenge, Java 8 introduces a clever solution: casting an object to an intersection of types. By adding multiple bounds to the lambda's type, you can elegantly make it serializable:
Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
This technique allows the lambda to automatically inherit the Serializable interface, enabling it to be serialized without the need for a "dummy" SerializableRunnable interface.
The above is the detailed content of How Can I Serialize a Lambda Expression in Java Without Creating a Dummy Interface?. For more information, please follow other related articles on the PHP Chinese website!