首页 >Java >java教程 >Java Lambda 可以序列化吗?我们如何使它们可序列化?

Java Lambda 可以序列化吗?我们如何使它们可序列化?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-22 09:29:28275浏览

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

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn