How does lambda expression serialization work in Java and how can it be used?
public interface SDoubleUnaryOperator extends DoubleUnaryOperator, Serializable { } public static void main(String[] args){ SDoubleUnaryOperator t = t->t*t; // - }
public static void main(String[] args){ DoubleUnaryOperator t = (DoubleUnaryOperator & Serializable)t->t*t; // - }
import java.io.*; public class Main { public static void main(String[] args) throws Exception { //saveLambda(); loadLambda(); } public static void saveLambda() throws IOException { Factory factory = new Factory(3); ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(new File("lambdas"))); output.writeObject(factory.createLambda(4,new SerializableData(3.3,4))); output.writeObject(factory.createLambda(5,new SerializableData(5.3,-4))); output.writeObject(factory.createLambda(3,new SerializableData(10.3,+80e-5))); output.close(); } public static void loadLambda() throws IOException, ClassNotFoundException { ObjectInputStream input = new ObjectInputStream(new FileInputStream(new File("lambdas"))); DoubleToString operator1 = (DoubleToString) input.readObject(); DoubleToString operator2 = (DoubleToString) input.readObject(); DoubleToString operator3 = (DoubleToString) input.readObject(); System.out.println(operator1.get(5)); System.out.println(operator2.get(5)); System.out.println(operator3.get(5)); } }
public class RemoteLambdaClass{ public static void main(String[] args) throws Exception{ DoubleUnaryOperator t1 = (DoubleUnaryOperator & Serializable) t->t*t; DoubleUnaryOperator t2 = (DoubleUnaryOperator & Serializable) t->t*t*t; ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(new File("lambdas"))); output.writeObject(t1); output.writeObject(t2); output.close(); } }
public class Main { public static void main(String[] args) throws Exception { File f = new File("./RemoteLambdaClass/"); // URLClassLoader mainLoader = (URLClassLoader) Main.class.getClassLoader(); Field classPathField = URLClassLoader.class.getDeclaredField("ucp"); classPathField.setAccessible(true); URLClassPath urlClassPath = (URLClassPath) classPathField.get(mainLoader); urlClassPath.addURL(f.toPath().toUri().toURL()); Class<?> clazz = mainLoader.loadClass("RemoteLambdaClass"); ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File(f,"lambdas"))); DoubleUnaryOperator o1 = (DoubleUnaryOperator) inputStream.readObject(); DoubleUnaryOperator o2 = (DoubleUnaryOperator) inputStream.readObject(); System.out.println(o1.applyAsDouble(2)); System.out.println(o2.applyAsDouble(2)); } }
4.0 8.0
Source: https://habr.com/ru/post/264003/
All Articles