保存您的lambda,以备不时之需-保存到文件

介绍

简短的帖子,描述了如何将Java lambda持久保存到文件中以在不同的过程中重复使用。

序列化Lambda

Java 8中引入的Lambda使函数成为Java语言的一等公民(几乎)。 它们消除了使用专用类来保存函数的需要。 但是,这是如何进行的呢?

实际上,javac劫持了包含函数的类,并添加了包含函数实现的静态方法。 函数调用站点被新添加的静态方法的调用替换。 有关lambda实现魔术的完整说明,请参见
文章

Oracle很有帮助地提供了SerializableLambda类,该类实现了lambda的可序列化形式,提供了足够的元信息来重建调用。 我们要做的就是将lambda转换为可序列化的,然后使用标准的标准机械来封送lambda。 以下是一些实用程序函数,用于对lambda进行序列化和反序列化。

public static <F extends Function & Serializable> void serialise(F f, String name) throws Exception {
    try (var oos = new ObjectOutputStream(new FileOutputStream(new File(name)))) {
        oos.writeObject(f);
    }
}

public static <T, R, F extends Function<T, R>> F deserialise(String name) throws Exception {
    try (var ois = new ObjectInputStream(new FileInputStream(name))) {
        return (F) ois.readObject();
    }
}

在序列化函数中,我使用相交类型将函数转换为Serializable。 有一个带有测试主体的小项目
在这里演示序列化。 执行功能的主要方法:

public class Main {

    public static void main(String[] args) throws Exception {
        if (false) {
            serialise(s -> "hello - " + s, "func1");
        }
        System.out.println(deserialise("func1").apply("Greg"));
        //rewrite func-1
        serialise(s -> "goodbye - " + s, "func1");
        System.out.println(deserialise("func1").apply("Greg"));
    }

    public static <F extends Function & Serializable> void serialise(F f, String name) throws Exception {
        try (var oos = new ObjectOutputStream(new FileOutputStream(new File(name)))) {
            oos.writeObject(f);
        }
    }

    public static <T, R, F extends Function<T, R>> F deserialise(String name) throws Exception {
        try (var ois = new ObjectInputStream(new FileInputStream(name))) {
            return (F) ois.readObject();
        }
    }

}

该项目的根目录中有一个序列化的lambda“ func-1”。 运行项目将看到func-1被覆盖,因此第二次执行将得到与第一次不同的结果:

第一次执行:

你好–格雷格
再见–格雷格

第二次执行:

再见–格雷格
再见–格雷格

希望您喜欢这篇小文章,并发现它有趣。

翻译自: https://www.javacodegeeks.com/2019/07/save-lambdas-rainy-day-save-file.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值