我如何优雅地序列化一个lambda?
例如,下面的代码抛出一个NotSerializableException
。我如何在不创建SerializableRunnable
“虚拟”接口的情况下修复它?
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();
}
}
发布于 2014-04-02 18:09:49
Java8为cast an object to an intersection of types by adding multiple bounds引入了这种可能性。因此,在序列化的情况下,可以这样写:
Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
而lambda会自动变成可序列化的。
发布于 2014-05-25 09:01:01
同样的结构也可以用于方法引用。例如下面的代码:
import java.io.Serializable;
public class Test {
static Object bar(String s) {
return "make serializable";
}
void m () {
SAM s1 = (SAM & Serializable) Test::bar;
SAM s2 = (SAM & Serializable) t -> "make serializable";
}
interface SAM {
Object action(String s);
}
}
使用可序列化的目标类型定义lambda表达式和方法引用。
发布于 2017-08-16 02:27:54
非常丑陋的演员阵容。我更喜欢为我正在使用的函数接口定义一个Serializable扩展
例如:
interface SerializableFunction<T,R> extends Function<T,R>, Serializable {}
interface SerializableConsumer<T> extends Consumer<T>, Serializable {}
然后,接受lambda的方法可以这样定义:
private void someFunction(SerializableFunction<String, Object> function) {
...
}
调用该函数时,您可以传递您的lambda,而不需要任何丑陋的强制转换:
someFunction(arg -> doXYZ(arg));
https://stackoverflow.com/questions/22807912
复制相似问题