当前位置: 首页 > 面试题库 >

获取lambdas类列表

谷彦君
2023-03-14
问题内容

在Java 8中,类的lambda似乎保留在数组中。例如,假设我们有此类:

public class LambdaFactory {
    public Supplier<Integer> getOne(){
        return () -> 42;
    }

    public Supplier<Integer> getTwo(){
        return () -> 128;
    }

    public Supplier<Integer> getThree(){
         return () -> 3;
    }
}

然后像这样打印出来:

    System.out.println(factory.getOne());
    System.out.println(factory.getOne());
    System.out.println(factory.getTwo());
    System.out.println(factory.getThree());

输出将是这样的

examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$2@1b9e1916
examples.LambdaFactory$$Lambda$3@ba8a1dc

所以我们可以在这里看到两件事。调用两次的同一个lambda会为我们提供相同的lambda对象(这与匿名内部类不同,在匿名内部类中我们每次都可以获取一个新的lambda对象)。我们还看到它们看起来像是被保存在类中的某种“
Lambda”结构中

我的问题是,我可以在课堂上掌握lambda吗?我没有任何理由这样做,我只是喜欢剖析事物


问题答案:

Lambda由JRE创建,其创建方式由JRE控制,并且在不同的JRE供应商之间可能有所不同,并且在将来的版本中可能会发生变化。

如果您想玩得开心,可以在运行时创建一个lambda,该lambda在类文件中没有相应的信息:

import java.lang.invoke.*;

public class ManualLambda {
  public static void main(String[] args) throws Throwable {
    MethodHandles.Lookup me=MethodHandles.lookup();
    MethodType t=MethodType.methodType(void.class);
    MethodType rt=MethodType.methodType(Runnable.class);
    CallSite site = LambdaMetafactory.metafactory(
      me, "run", rt, t, me.findStatic(ManualLambda.class, "sayHello", t), t);
    MethodHandle factory=site.getTarget();
    Runnable r=(Runnable)factory.invoke();

    System.out.println("created lambda: "+r);
    r.run();
  }
  private static void sayHello() {
      System.out.println("hello world");
  }
}

上面的代码追溯了创建lambda时发生的情况。但是对于编译时(“实际”)lambda表达式,整个过程都是由单invokedynamic字节代码指令触发的。该LambdaMetafactory.metafactory(…)方法是
引导程序
方法,当invokedynamic首次执行指令时会调用该方法。返回的CallSite对象与invokedynamic指令永久关联。如果CallSitea为a,ConstantCallSite并且MethodHandle每次执行都返回相同的lambda对象,则该invokedynamic指令将永远“产生”相同的lambda实例。



 类似资料:
  • sp_get_terms($tag) 功能: 返回符合条件的所有分类 参数: $tag:查询标签,以字符串方式传入,例:"ids:1,2;field:term_id,name,description,seo_title;limit:0,8;order:path asc,listorder desc;where:term_id>0;" ids:调用指定id的一个或多个数据,如 1,2,3 fiel

  • 说明 用于对商品分类的新增/修改操作 请求地址 http://api.dc78.cn/Api/mall_list_category 请求方式 POST 请求参数 GET参数 描述 无 POST数据 描述 无 返回 { "data": [ { "id": "1", "no": "", "name": "小家电", "pic": "", "rank": "0", }, { "id": "2", "no

  • 说明 用于获取菜品/类别列表,可以在本地显示 请求地址 http://api.dc78.cn/Api/do_get_dishlist 请求方式 GET 请求参数 URL参数 参数名称 描述 cateonly cateonly=1,只返回菜品类别。不传默认为全返回 GET参数 参数名称 描述 rebate 类别折扣 "rebate": 100 设置为100表示这个菜品不打折 返回 { "status

  • 问题内容: 自从Java8最近发布以来,它的全新lambda表达式看起来真的很酷,我想知道这是否意味着我们曾经习惯的Anonymous类的消亡。 我对此进行了一些研究,发现了一些很酷的示例,这些示例说明Lambda表达式将如何系统地替换这些类,例如Collection的sort方法,该方法用于获取Comparator的Anonymous实例来执行排序: 现在可以使用Lambdas完成: 并且看起来

  • 由于Java8最近发布了,它的全新lambda表达式看起来真的很酷,我想知道这是否意味着我们已经习惯的匿名类的消亡。 看起来出奇的简洁。所以我的问题是,有没有理由继续在Java8中使用那些类,而不是lambdas? 编辑 同样的问题但是相反的方向,使用Lambdas而不是匿名类有什么好处,既然Lambdas只能与单一方法接口一起使用,那么这个新特性只是一个只在很少情况下使用的快捷方式还是真的有用呢

  • 问题内容: jQuery中是否有一种方法可以循环或将分配给元素的所有类分配给数组? 例如 我将在上面的“ dolor_spec”中寻找“特殊”类。我知道我可以使用hasClass(),但是实际的类名有时不一定是已知的。 问题答案: 您可以用来获取一组类名。 然后,您可以迭代并找到所需的那个。 jQuery并没有真正帮助您…