当前位置: 首页 > 知识库问答 >
问题:

使用双冒号(::)[duplicate]调用ExecuterService中的方法

巴帅
2023-03-14

我有一个类分别组成两个方法静态和非静态,根据我有限的知识提交方法接受可运行的,可调用的实例直接或通过lamba表达式。

今天我知道了,我们甚至可以直接使用双冒号调用或触发静态和非静态方法,这是在Java8中添加的。

我只是想知道这是如何工作的,我的类中没有run方法,它也没有实现runnable,甚至我也没有使用Lamba?

使用::是一个好的实践吗?还是应该传递runnable或callable实例。

Class A {

public static void printSomething(){
System.out.println("Staitc Method");
}

public void print()
{
System.out.println("Non-Staitc Method");
}

}

psvm()
{
A a = new A():
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(A::printSomething);  //Expected is runnable or callable task
es.submit(a::print);
}

共有1个答案

翟淇
2023-03-14

a::PrintSomething称为方法引用。当您在需要Runnable或Callable这样的接口的地方使用方法引用时,Java会自动创建调用该方法的接口的实现。

也就是说,

es.submit(A::printSomething);

行为与

es.submit(new Runnable() {
    public void run() {
        A.printSomething();
    }
});
    null

另一种实现相同的方法是使用lambda表达式,例如:

es.submit(() -> A.printSomething());
 类似资料:
  • 我想知道冒号与Perl 6中的方法和函数调用有什么关系。郑重声明,我使用的是基于MoarVM版本2015.05构建的perl6版本2015.05-55-gd84bbbc。 我刚刚在Perl6规范测试(S32-io)中看到了以下内容(我添加了评论): 据我所知,这相当于: 这两者似乎都需要多个论点并很好地扁平化列表: 这两种不同的语法肯定是有原因的。是否有任何理由使用一种或另一种语法? 我还注意到,

  • 我正在学习spring.io教程。有一个函数是这样的:

  • 问题内容: 由于IE7和IE8不支持对伪元素(例如或)使用双冒号表示法,并且由于现代浏览器支持向后兼容的单冒号(例如),我应该仅使用单冒号表示法以及何时使用IE8的市场份额下降到可以忽略的水平,然后回去查找/替换我的代码库?还是我都应该同时包括: 如果我关心IE8用户(可怜的朋友),单独使用double似乎很愚蠢。 问题答案: 请勿 同时 使用逗号和逗号。兼容CSS 2.1(不支持CSS3)的用户

  • 本文向大家介绍Lua中调用函数使用点号和冒号的区别,包括了Lua中调用函数使用点号和冒号的区别的使用技巧和注意事项,需要的朋友参考一下 本文是面向对象预热篇,讲解函数两种调用方式的区别,初学者比较容易被坑。 1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?   这

  • 问题内容: 我有这样的字符串 我想用冒号作为分隔符,而不是双冒号。所需结果: 我正在尝试: 但我得到了错误的结果。 在此期间,我逃避,用 问题答案: 您可以继续讨论。这使用两个否定的环视(回溯和回溯),它们断言有效匹配只有一个冒号,在它之前或之后没有冒号。 解释模式: 这两种环视都是必需的,因为如果只有后向,则正则表达式引擎将匹配其中的第一个冒号(因为前一个字符不是冒号),如果只有前瞻,则第二个冒

  • 当使用双冒号操作符引用重载的方法时,Java似乎不能确定要使用的正确方法。考虑这个例子: 对 的第一次调用不会编译,并给出以下错误: 然而,第二个调用编译得很好,这意味着问题在于的重载。只有一个<code>setter</code>重载是适用的,所以我不明白为什么这不起作用。 可以通过使用指定参数类型的lambda来解决这个问题,但这要详细得多。 有更好的方法来处理这种情况吗?还是我一直在解决这个