Lamda 可以序列化吗?
Java lambda 本质上不是可序列化的,这意味着它们不能直接写入流并稍后读回。当尝试在不同的上下文中持久化或传输 lambda 时,这可能会带来挑战。
序列化难题
考虑以下代码片段:
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(); } }
当尝试序列化上述代码中的 lambda 表达式时,会抛出 NotSerializedException。这是因为 lambda 默认情况下在 Java 中不可序列化。
优雅的 Lambda 序列化
要解决此问题并启用 lambda 序列化,我们可以利用以下交集Java 8 中引入的类型功能。这允许我们为强制转换指定多个边界,有效地将 lambda 转换为实现 Runnable 和可序列化接口。
这里是优雅地解决序列化挑战的更新代码:
Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
有了这个解决方案,lambda 现在可以无缝写入对象流,持久化到文件系统,然后反序列化并执行,没有任何错误或异常。
以上是Java Lambda 可以序列化吗?我们如何使它们可序列化?的详细内容。更多信息请关注PHP中文网其他相关文章!