我可以使用反射来动态获取方法并调用它。我怎样才能用 lambda 做同样的事情? IE 之类的东西
class Foo{
public static String mapper(Object o){
return "dummy val";
}
}
class Bar {
public static void main(String args[]){
String[] arr = {"a", "b", "c"};
Lambda reflectedMapper = ReflectionUtils.getLambda("Foo.mapper");//How do I actually write this line?
List<String> mapped = arr.stream().map(reflectedMapper).collect(Collectors.toList();
}
}
最佳答案
如果我理解正确的话,例如:
static class Test {
public static boolean transform(String s) {
return s.toUpperCase().equals("SOME");
}
}
您可以获得您正在寻找的Function
,如下所示:
MethodType methodType = MethodType.methodType(boolean.class, String.class);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle handle = lookup.findStatic(Test.class, "transform", methodType);
Function<String, Boolean> f = (Function<String, Boolean>) LambdaMetafactory.metafactory(
lookup,
"apply",
MethodType.methodType(Function.class),
methodType.generic(),
handle,
methodType)
.getTarget()
.invokeExact();
另请注意,同样的方法也符合 Predicate
的资格;因为它的签名是 String, boolean
并且可以这样使用:
MethodType predicateMT = MethodType.methodType(boolean.class, Object.class);
MethodType stringPredicateMT = MethodType.methodType(boolean.class, String.class);
MethodType methodType = MethodType.methodType(boolean.class, String.class);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle handle = lookup.findStatic(Test.class, "transform", methodType);
Predicate<String> p = (Predicate<String>) LambdaMetafactory.metafactory(
lookup, "test",
MethodType.methodType(Predicate.class),
predicateMT,
handle,
stringPredicateMT)
.getTarget().invokeExact();
System.out.println(p.test("Some"));
关于java - 如何使用反射来获取对可以传递的 lambda 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44643786/