gpt4 book ai didi

java - 是否可以使用 Class::method 语法避免对 Lambda 进行装箱和拆箱? ( java )

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

我最近偶然发现了 Class::method允许您插入来自静态方法的 lambda 代码的语法,如下所示:

public class Main {

public static void foo(int foo) {
System.out.println(foo);
}

public static void bar(Consumer<Integer> bar) {
bar.accept(1);
}

public static void main(String[] args) {
bar(Main::foo);
}

}

问题是,1的装箱和拆箱还会发生吗?毕竟,bar的参数是 Consumer<Integer>它通常应该装箱原语,但foo(int)是一种接受原语的方法,因此不需要装箱。

那么,会发生什么?是否1变成一个Integer还是保持原始状态?

附带说明一下,我知道 IntConsumer提供了一种摆脱装箱和拆箱的解决方案,但并非每个功能接口(interface)都有针对每个原始类型的替代方案,因此出现了问题。

最佳答案

是的,它是装箱然后拆箱的。

编译代码然后反编译类文件显示以下内容:

import java.util.function.Consumer;

public class Main {
public Main() {
}

public static void foo(int foo) {
System.out.println(foo);
}

public static void bar(Consumer<Integer> bar) {
bar.accept(Integer.valueOf(1));
}

public static void main(String[] args) {
bar(Main::foo);
}
}

编译器会自动装箱 1,这意味着当调用 foo() 时它将被取消装箱。

关于java - 是否可以使用 Class::method 语法避免对 Lambda 进行装箱和拆箱? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39303074/

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