介绍
简短的帖子,描述了如何将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-1serialise(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