相关疑难解决方法(0)

除了保存代码行之外,lambda表达式还有什么用处吗?

除了保存代码行之外,lambda表达式还有什么用处吗?

lambda提供的特殊功能是否解决了不容易解决的问题?我见过的典型用法是代替写这个:

Comparator<Developer> byName = new Comparator<Developer>() {
  @Override
  public int compare(Developer o1, Developer o2) {
    return o1.getName().compareTo(o2.getName());
  }
};
Run Code Online (Sandbox Code Playgroud)

我们可以使用lambda表达式来缩短代码:

Comparator<Developer> byName =
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

117
推荐指数
5
解决办法
2万
查看次数

谁调用 describeConstable(),何时调用?

我有点高兴地偶然发现Constable了 JDK 15 之类的东西。我基本明白了。

在翻遍了所有编译器理论甚至理解了一点之后,我发现我仍然有一个问题:谁调用 aConstabledescribeConstable()方法,何时调用? Brian 的演示似乎暗示它在编译时以某种方式被访问。对这些事情太天真了,我期待它出现在使用页面jdk.compiler或其他东西中。相反,唯一的消耗似乎是在jdk.incubator.foreign包中。(显然,我知道它可能会被使用页面未公开的某些私人机器使用;因此我的问题。)

我放在Thread.dumpStack()一个describeConstable()哑类的实现,实现Constable和回报Optional.ofNullable(null)只是为了看看会发生什么,......什么都没有发生在编译期或运行时。

(我确实知道,在 JDK 12 之前,如果您想编写动态常量,您必须使用 ASM 或 ByteBuddy 或类似的东西。不过,在我幼稚的眼中,它看起来像是Constable允许您的用户类“插入”Java编译器并允许为你做不断的写作。我也知道里面的类和方法java.lang.constant主要是为编译器编写者准备的,但Constable在我看来有点例外。最后,我显然明白可以调用我希望随时使用这种方法,但这显然不是它的目的。)

编辑:(非常)感谢下面一些非常有帮助和耐心的答案和评论,我想我开始明白了(我不是编译器,这点应该很明显)。虽然我知道一旦一个X implements Constableexists的实例,那么ContantDesc它从它的返回describeConstable()必须由其他常量描述符(本身)组成,虽然我知道ClassDesc#of()可以在编译时调用“常量工厂”(例如等等),显然必须只接受其他常量作为他们可能需要的任何参数,我仍然不清楚 X implements Constable首先在编译期间如何实例化任意对象,而......它正在被编译(!)describeConstable() 可以在编译时调用它。

请记住,这个问题的答案可能是我所缺少的关于编译器的基本信息,或者他们在静态分析期间遇到的各种问题。我只看到一个实例方法 …

java constants

10
推荐指数
1
解决办法
287
查看次数

在 Class.getDeclaredMethods() 中返回内部 Lambda?

考虑这个类:

public class Handler
{
    private Supplier<Foo> foo;

    public void handle( Bar bar )
    {
        foo = () -> bar.getFoo();
    }
}
Run Code Online (Sandbox Code Playgroud)

并考虑这个想要访问 handle() 方法的反射片段。

for( Method method : Handler.class.getDeclaredMethods() )
{
    if ( method.getParameterCount() == 1 && Bar.class.isAssignableFrom( method.getParameterTypes()[0] ) )
    {
        // This is the method you are looking for
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是寻找

  • public void Handler.handle(Bar)

它发现

  • private Foo Handler.lambda$3(Bar)

显然,然后抛出异常:

java.lang.IllegalAccessException: class HandlerService cannot access a member of class Handler with modifiers "private static"
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里发生了什么吗?

看起来 Java …

java reflection lambda java-11

5
推荐指数
1
解决办法
238
查看次数

标签 统计

java ×3

lambda ×2

constants ×1

java-11 ×1

java-8 ×1

reflection ×1