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

具有完整构造函数调用的方法引用作为Java中的lambda表达式

高砚
2023-03-14
问题内容

不久前,我遇到了比我更好的竞争性答案,我的答案是使用全新的方法代替lambda。

Stream.generate(new AtomicInteger(1)::getAndIncrement)...

我查看了有关方法引用的Oracle规范,并定义了4种类型:

  • 引用静态方法 ContainingClass::staticMethodName
  • 引用特定对象的实例方法 containingObject::instanceMethodName
  • 引用特定类型的任意对象的实例方法 ContainingType::methodName
  • 引用构造函数 ClassName::new

我很难将这一分类。我还没有找到关于SO的任何问题或文档中说明的任何相关问题。如何将其翻译为匿名课程?

我的怀疑是:

IntStream.generate(new IntSupplier() {

    AtomicInteger atom = new AtomicInteger(1);

    @Override
    public int getAsInt() {
        return atom.getAndIncrement();
    }
})....

…我不知道这怎么可能。乍一看,我想表达的是:

IntStream.generate(new IntSupplier() {

    @Override
    public int getAsInt() {
        return new AtomicInteger(1).getAndIncrement();
    }
})....

… …不过这没什么() -> new AtomicInteger(1).getAndIncrement()

这种表达在哪里定义以及如何在lambda / anonymous类中完全重写?


问题答案:

好吧,newAtomicInteger(1)返回一个实例,所以是第二个实例。有关如何翻译的确切详细信息是特定于实现的,但是它是创建的单个实例,并且由JLS
15.13.3支持

首先,如果方法引用表达式以ExpressionName或Primary开头,则将评估此子表达式

用简单的英语来说,before部分在 第一次遇到声明时会::进行评估。 __

您的假设如何转换几乎是正确的,就像在函数本身之外生成实例并使用该实例一样-由于它实际上是最终的,因此允许这样做。



 类似资料:
  • 上面写着编译错误 Employee::new、1L、“”、“ 无法解析构造函数。

  • 问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是

  • 鉴于 IntelliJ IDEA 2016.1.1报告“可以替换为方法引用”。 我知道无参数构造函数的< code>Foo::new语法,但是不知道如何将< code>foo作为参数传入。我肯定漏掉了什么。

  • 本文向大家介绍使用Java8中的方法引用来引用构造函数,包括了使用Java8中的方法引用来引用构造函数的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式来调用/引用以及现有方法的名称。除了实例和静态方法,您还可以使用new关键字

  • 我的目标是优化我的应用程序代码。我的代码如下所示: 当我在Netbeans中使用Findbugs进行静态分析时,它显示了一个类似于“方法调用无效的新整数(int)构造函数;使用Integer.valueOf(int)”的警告/错误。 我知道新整数(int)和整数之间的区别。valueOf(int)。 一个创建一个附加对象,另一个不创建。一个不缓存,另一个缓存。 所以我这样修改了我的代码... 但同

  • IntelliJ一直建议我用方法引用替换我的lambda表达式。 两者之间有什么客观差异吗?