gpt4 book ai didi

java - 执行列表中的可运行程序

转载 作者:行者123 更新时间:2023-11-30 06:05:10 25 4
gpt4 key购买 nike

我有一个可运行列表,我想使用 lambda 表达式调用它们:

Arrays.asList(runnable1, runnable2, runnable3, ...).forEach(r->r.run());

除了以下方式之外,是否有“更好”(更高效)的快捷方式来调用 Runnablerun() 方法?

Arrays.asList(runnable1, runnable2, runnable3, ...).forEach(Runnable::run);

我认为这个表达式将被转换为将可运行实例包装在列表中的Runnable

编辑:我的假设/担忧(可能是错误的)是编译器会将表达式 list.forEach(Runnable::run) 转换为类似这样的内容,因此不“高效”:

list.forEach(r -> new Runnable() {

@Override
public void run() {
r.run();
}
});

最佳答案

无论你写

Arrays.asList(runnable1, runnable2, runnable3, ...).forEach(r->r.run());

Arrays.asList(runnable1, runnable2, runnable3, ...).forEach(Runnable::run);

无论哪种情况,都会生成一个 Consumer 实例,因为这是 Iterable.forEach 所期望的。

消费者将等同于

Arrays.asList(runnable1, runnable2, runnable3, ...).forEach(new Consumer<Runnable>() {
public void accept(Runnable r) {
r.run();
}
});

但这不是可运行对象的包装器,因为它封装了应用于作为参数传入的任意Runnable实例的操作。因此,为整个 forEach 操作最多创建一个 Consumer 实例。

this answer 中所述,JVM 将负责创建 Consumer 实例,并可以自由地重用现有实例,这在实践中发生在当前实现和非捕获实例中函数式接口(interface),适用于两种变体,使用 lambda 表达式或方法引用,因此只有一个 Consumer 实例,即使在后续的语句求值中也会重用。

与当前编译器的唯一区别是 lambda 表达式 r->r.run() 将在类中生成一个方法,调用 run() 方法,而对于方法引用,运行时生成的Consumer实现类将直接调用它,这使得方法引用在难以测量规模上更加高效。 p>

关于java - 执行列表中的可运行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com