java - 如何使用反射来获取对可以传递的 lambda 的引用?

标签 java reflection lambda java-8

我可以使用反射来动态获取方法并调用它。我怎样才能用 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/

相关文章:

java - 如何使用 Lambda 在 java1.8 中的字符串集合中搜索特定项?

java - JOOQ PostgreSQL 连接导致 InvalidResultException

java - java生产者消费者模式如何出现死锁和饥饿问题?

c# - 为什么这个关于反射的 MSDN 示例失败了?

scala - 在 scala 2.10 中使用 typetag 获取类加载器

python - 在 addConstraint 中使用变量会产生错误的答案,但不使用变量则可以正常工作

java - 集合功能方法是否调用 get、put 等?

java - 我可以重构方法调用不同但代码结构一致的代码片段吗?

java - JPA Hibernate::实体的继承,带有附加的 OneToMany 列表

java - Reflection API 中 new Class[0] 的含义