问题标签 [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 投票
17 回答
449118 浏览

java - Java 传递方法作为参数

我正在寻找一种通过引用传递方法的方法。我知道 Java 不会将方法作为参数传递,但是,我想找一个替代方案。

有人告诉我,接口是作为参数传递方法的替代方法,但我不明白接口如何通过引用充当方法。如果我理解正确,接口只是一组未定义的抽象方法。我不想发送一个每次都需要定义的接口,因为几个不同的方法可以使用相同的参数调用相同的方法。

我想要完成的是与此类似的事情:

调用如:

0 投票
2 回答
2053 浏览

java - 方法引用的 Lambda 转换

如果我有:

以下转换为完整的 lambda 表达式是否正确?

然后,还有一个问题:如果我写:dir.listFiles(B::test2);我从编译器那里得到:

但为什么该错误不会引发:dir.listFiles(File::isFile);

0 投票
2 回答
1800 浏览

java - 方法引用的类别是什么?

我有以下代码:

Intellij Idea 建议我应该将 lambda 表达式替换为方法引用。我想这样做,只是我不确定流列表的新通用类型应该是什么。我试图评估表达式 personList::stream 但我得到“没有这样的实例字段:'stream'”。如果我尝试 List::stream 或 ArrayList::stream (人员列表的具体类型),我会得到:“没有这样的静态字段:'stream'”。有没有办法将方法引用添加到列表中?如果是这样,列表的通用类型应该是什么?

谢谢

正如 assylias 指出的那样,IDEA 只是在抱怨并且代码运行没有问题,我仍然在 IDEA 13 中遇到相同代码的问题,因为 stream.add 期望返回 Stream 和 List::stream 的函数返回 Stream。为了解决它,我最终使用了以下代码:

0 投票
2 回答
2113 浏览

java - 方法引用的通用功能接口的方法签名

假设你有一个方法

Consumer通过使用新的方法引用,您可以从中创建一个

如果您现在通过反射查看创建的 Consumer 的类,您会看到它唯一声明的方法是

如果通过创建匿名内部类以旧方式创建消费者

会有桥接法void accept(Object)以及void accept(String).

现在假设我们必须传递这个消费者,从而失去它的泛型类型。如果你有一个实现Consumer<String>而不是 Lambda 表达式,你可以通过使用 relfection 来访问它的方法来取回它。由于通过方法引用创建的消费者只有通用方法,所以这不起作用。有没有办法获取方法引用创建的消费者的参数类型?

0 投票
3 回答
2905 浏览

java - Java 8 中的实例方法引用类型有什么区别?

所以 Java 8 引入了方法引用,文档描述了这四种类型

我的问题是这两种实例类型有什么区别?

  1. 引用特定对象的实例方法。
  2. 引用特定类型的任意对象的实例方法。

两者都引用参考,但有什么显着不同?是用来解决它们的类型推断不同吗?(在他们的示例中)一个是闭包而另一个是 lambda 是否重要?它与方法的参数数量有关吗?

0 投票
2 回答
18088 浏览

java - 为什么 Comparator.comparing 不适用于 String::toLowerCase 方法参考?

我正在尝试按相反的顺序(忽略大小写)对字符串数组进行排序,而不修改它,只打印它。所以我正在使用Java8流。但我无法做到。

这是我的尝试:

这里的问题是String::toLowerCase在静态方法中不被接受Comparator.comparing

同时,我设法对数组进行了排序,但对其进行了修改

那么,最简​​单的解决方法是什么?

0 投票
1 回答
2834 浏览

java - 具有不同参数的重载方法的方法引用无效

尝试编译表达式Comparator.comparing(String::toLowerCase)时,Java 编译器返回错误。有关详细信息,请参阅以下问题:

为什么 Comparator.comparing 不适用于 String::toLowerCase 方法参考?


我试图尽可能地减少这个问题。特别是,我已经删除了几乎所有对其他类的依赖。main方法包含两个方法调用。第一条语句编译没有错误,而第二条语句产生错误。

这很奇怪,因为第二个baz方法不应该在这种情况下适用,因为参数数量不匹配。我看过 JLS8 (15.13)。然而,这并没有帮助,因为方法引用的规则非常复杂。

Q:为什么第二种情况会出现编译错误?根据 JLS,真的应该存在编译错误吗?根据对另一个问题的一些评论,Netbeans 中没有编译错误。


作为参考,我使用的是 JDK8 版本 1.8.0-b132。如果在命令行上编译程序,编译器会显示以下错误消息:

0 投票
1 回答
137 浏览

java - 是否有可用于引发异常的方法参考?

假设我有以下代码:

有没有办法让它更简洁,现在可用,或者可能在未来的 Java 版本中可用?我期望以下内容:

有关更多信息,我打算将此代码用于可能发生异常情况但并不总是需要RuntimeException抛出异常的方法。我想给呼叫者在异常情况发生时做任何他们想做的事情的自由。

在我看来,这在 Java 8 中是不可能的,是否已经讨论过这个问题,是否有任何理由无法做到这一点?

0 投票
2 回答
403 浏览

java - 无法弄清楚行为:使用 lambda 的方法参考

考虑下面的代码,

run()通过方法返回的Runnable实例testStatic方法应该被调用。控制台上的输出应该是“运行”。

但是这段代码没有调用run()实例方法,r控制台中也没有打印任何内容。

有人可以解释一下原因。

如果我没有正确使用方法参考“::”并发表评论。

0 投票
1 回答
459 浏览

java - 如何使用方法引用调用参数化方法

考虑下面的代码,

如果方法的参数将被消除,我们可以调用该testStatic方法作为TestInter接口实现的主体,如this so answer中所述。abc()testStaic()

但是在这种情况下,我们如何为参数化方法编写方法引用testStatic