问题标签 [method-reference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
22723 浏览

java - System.out::println 的等效 lambda 表达式是什么

我偶然发现了以下使用方法引用的 Java 代码System.out.println

什么是等效的 lambda 表达式System.out::println

0 投票
1 回答
819 浏览

java - 有没有办法使用方法引用进行降序排序?

在 Java 8 中,我可以使用 lambda 或方法引用进行排序:

有人知道吗?

0 投票
1 回答
1048 浏览

java - 在这种情况下使用方法引用有什么好处?

我有两个变量如下:

List<Basket> bigBasket = new ArrayList<>(); Basket basket = new Basket();

bigBasket我编写了以下代码来添加和中的项目之间的关系basket

现在这一切都很好,但是 IntelliJ 检查了代码并提出使用方法参考来改进它,所以我得到了以下信息:

所以上面的行更少,但它的实际优势是什么?我并不完全了解 Java 8 功能的好处,所以这可能就是我不太了解正在发生的事情的原因。

在我看来,假设您对 Java 8 功能了解不多,那么从立即理解正在发生的事情与标准 for 循环的意义上说,“改进”版本的代码可读性不是很好。

有人可以解释“改进”代码与标准 for 循环的好处吗?

编辑:删除了对 lambdas 的不正确引用。该代码只是使用方法引用——这只是我的一个术语错误!

0 投票
1 回答
398 浏览

java - 用于引导 lambda 表达式或方法链接的方法引用的实用程序类?

使用 Java 8 中引入的函数式接口,您可以轻松地将不同的表达式链接到一个新的表达式中,如下面的代码片段所示。

在这种情况下,2 个 String Predicate被链接到一个新的Predicate中。当您至少有一个句柄(即变量)来调用链接方法(在本例中为'')时,这可以正常工作。但是,如果要链接的表达式表示为 lambda 或方法引用,则需要将其中一个显式转换为变量,这会使其非常冗长。当编译器无法确定确切的类型时,您必须求助于这种构造。但在大多数情况下,这只是我想避免的冗长开销。

在这个例子中,我自己编写了实用方法' chain '。但我也可以为其他功能接口(FunctionConsumerSupplierBiConsumer ……)创建一个。

我不想使用这些方法创建自己的实用程序类(我可能会将其复制粘贴到我从事的每个项目中),而是想知道这样的类是否存在于 JDK 或某个库中?

另一方面,如果这样的类不存在并且我不应该自己创建一个,我想听听为什么。

0 投票
1 回答
1069 浏览

java - 当运行时类型也是泛型类型时,将方法引用用作期望与泛型类型接口的方法的 lambda 时的编译器错误

我正在尝试编写一些代码来接收java.util.function.*包中类的各种实现,但是对于我真正想要解决的特定语法,我一直在针对某个编译器错误运行(像obj.<Type>foo(/*...*/)工作一样的显式类型参数,但它们缺乏恩典)。

简而言之,我希望能够始终尽可能使用方法引用,但出于某种原因,我不明白为什么编译器无法理解下面解释的引用。

假设有以下两个类(实现无关):

一些具有 getter/setter 方法的实体类:

对该实体类的实例执行操作的其他一些类:

在执行对这些方法的调用时,编译器会给我各种错误:

前任。1)调用期望函数的方法工作得很好,没有编译错误:

前任。2)然而调用期望双消费者的方法给了我这个:

前任。3)正如预期的那样,明确说明类型工作得很好,没有编译错误:

前任。4)然而,当我写出 lambda 时,它给了我一个不同的编译错误(虽然在 lambda 参数中说明类型可以正常工作):

前任。5)当调用期望两者的方法时,每个参数都会出现不同的编译错误:

前任。6)再次,正如预期的那样,明确说明类型再次正常工作,没有编译错误:

前任。7)这是最让我感到困惑的:对于同时需要函数和 biconsumer 的方法,写出 biconsumer(无类型)并使用函数的方法引用,工作正常,没有编译错误(?!) :

我不明白的是,编译器在不同场景中确定运行时类型/类型擦除时,显然会以不同方式处理显式 lambda 和方法引用,即:

  1. 获取参数并返回值的函数式接口
  2. 获取参数但不返回值的函数式接口
  3. 带有 1. 和 2. 类型参数的方法

这似乎只发生在函数接口的类型本身是泛型类型(在本例中为 List)时,这让我相信这与类型擦除有关,但我对回答。

我很想能够写...

...没有显式类型或普通 lambda 表达式。

如果有办法重构方法FooBar来支持这一点,我真的很想知道。

当然,如果有人能够解释编译器的这些不同行为,我也会非常感激!:-)

编辑

我特别有兴趣了解为什么示例 #1 和 #7确实有效,但为什么示例 #4 本身不起作用(然后,为什么示例 #2 也不起作用)。

0 投票
2 回答
140 浏览

scala - 如何动态地将方法引用绑定到特征?

给定

如何addAsMethodReference在不手动BinaryOperator 实施BinaryOperator的情况下绑定?

Java 8 SAM 可以正常工作。我可以在 Java 8 中使用二元运算符特征的任何地方使用方法引用。

理想情况下,我想写如下内容:

我想要这种asNewInstanceOf方法的原因是它适用于任何方法签名。我不在乎传递了多少参数。如果我必须手动实现这一点,我必须仔细匹配每个xy. 这在更大范围内容易出错。

如果一方有多个抽象方法,则规范left.asNewInstanceOf[right]将在编译时失败。right如果left侧不是与侧中的单个抽象方法签名匹配的功能类型right,它将在编译时失败。right侧面不需要是特征,它可以是具有单个抽象方法的抽象类。

0 投票
1 回答
186 浏览

java - Java 8 method references - dereferenced only once?

I'm confused with method references. Consider the following script.

So it seems that:

  • The compiler cannot inline method references because they are polymorphic. They are not resolved at compilation time, but at runtime.
  • But i::m does not behave like i.m()...

So my questions are:

Are method references using reflection? And why they do only once?

0 投票
1 回答
14538 浏览

java - Java 8 链式方法参考?

假设有一个典型的 Java Bean:

我想在 BiConsumer 的帮助下创建一种更抽象的调用设置器的方法:

有没有办法(myBean, id) -> myBean.getList().add(id)用链式方法引用替换 lambda,比如(myBean.getList())::addmyBean::getList::add别的什么?

0 投票
1 回答
254 浏览

java-8 - How do I use [TypeArguments] with a constructor reference in Java 8?

Section 15.13 of the Java Language Specification for Java 8 describes this form of the method reference syntax for creating a constructor reference:

For example:

That all works fine, but it seems that absolutely anything (excluding primitives) can be also supplied for the [TypeArguments] and everything still works:

Here's a silly example to prove the point:

A few questions arising:

[1] Since the String class doesn't even use generics, is it valid that the compiler allows the creation of that test2 constructor reference with those meaningless [TypeArguments]?

[2] What would be a meaningful example of using [TypeArguments] when creating a constructor reference?

[3] Under what conditions is it essential to specify [TypeArguments] when creating a constructor reference?

0 投票
1 回答
762 浏览

reflection - 通过 Consumer<> 对象获取类名

我想使用类的对象检测类名Consumer<>

例子

可能吗?