Tôi muốn tạo hàm lambda trong Java 8, lấy tên lớp và sau đó khởi tạo lại hàm từ tên lớp của nó.Khởi tạo hàm Java lambda theo tên
Đây là những gì tôi cố gắng:
import java.util.function.Consumer;
public class SimpleLambda
{
public static void call(String aLambdaClassName, String aArg) throws Exception
{
Class<Consumer<String>> lClass = (Class<Consumer<String>>) Class.forName(aLambdaClassName);
Consumer<String> newlamba = lClass.newInstance();
newlamba.accept(aArg);
}
public static void main(String[] args) throws Exception
{
{
// Attempt with a static method as lambda
Consumer<String> lambda = Host::action;
String classname = lambda.getClass().getName();
call(classname, "Hello world");
}
{
// Attempt with a locally defined lambda
Consumer<String> lambda = (s) -> { System.out.println(s); };
String classname = lambda.getClass().getName();
call(classname, "Hello world");
}
}
}
class Host {
public static void action(String aMessage) {
System.out.println(aMessage);
}
}
Tuy nhiên, với mã này (ở cả hai phiên bản, sử dụng tài liệu tham khảo phương pháp tĩnh và sử dụng lambda tại địa phương tuyên bố), tôi nhận được một ngoại lệ:
Exception in thread "main" java.lang.ClassNotFoundException: mypackage.SimpleLambda$$Lambda$1/471910020
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at mypackage.SimpleLambda.main(SimpleLambda.java:12)
Tôi đã có thể mong đợi rằng tại ít nhất tôi có thể tái tạo lại tham chiếu phương pháp tĩnh ... không, dường như không.
Tôi đã sử dụng cách tiếp cận tương tự với Groovy Closures và hoạt động tốt. Vì vậy, tôi chỉ làm điều gì đó sai trái với Java 8 lambdas, hoặc là nó không thể khởi tạo lambda theo tên? Tôi tìm thấy một số gợi ý trên mạng mà lambdas có thể được (de) tuần tự hóa, vì vậy tôi hy vọng nó cũng nên có thể nhanh chóng chúng theo tên.
Bạn đang cố gắng làm gì với họ? Lambdas không được khởi tạo, chúng chỉ * là *. – 4castle
Về cơ bản, tôi muốn xử lý một lambda giống như một lớp bên trong tĩnh với một hàm duy nhất. Tôi muốn vượt qua nó cho mỗi tên lớp bởi vì tôi cần phải vượt qua nó thông qua một API mà chỉ chấp nhận tham số String.Vì vậy, một khi tôi nhận được tên bên trong API, tôi muốn tạo lại lambda một lần nữa từ tên lớp của nó để tôi có thể gọi nó. Âm thanh lạ? Vâng, nó là ... nhưng như tôi đã nói: đã làm nó trong Groovy và hoạt động độc đáo. Tôi có cảm giác nó sẽ không hoạt động trong Java, nhưng nếu ai đó có một đầu mối làm thế nào để làm điều đó, sẽ thực sự tuyệt vời. – rec
Tôi đã cập nhật ví dụ để làm cho việc sử dụng rõ ràng hơn. – rec