在Java 8中,有一个类似于函数指针(java.util.function.Function
)的功能。它通常使用如下:Function<LookupKey,LookupResult>
,但是,如果方法返回基本类型,则会出现问题。 Function<ArgType,Void.TYPE>
不起作用,无法使用非常混乱的错误消息进行编译(“找不到符号Void.TYPE
”)。我宁愿避免改变我的方法来返回Object
只是为了传递null作为结果。
答案 0 :(得分:7)
如果您的函数不应返回值,请考虑改为使用Consumer<T>
。
如果您的函数应返回ìnt
或long
,请考虑使用返回基本类型的ToIntFunction<T>
或ToLongFunction<T>
。
最后,如果您需要使用基本类型但想要返回引用类型,请使用IntFunction<T>
或LongFunction<T>
。
要完成列表:IntToLongFunction
,LongToIntFunction
,IntUnaryOperator
和LongUnaryOperator
支持使用和返回原始类型。
答案 1 :(得分:3)
改为使用Consumer界面。不返回任何内容的过程不是“函数”。
答案 2 :(得分:0)
如Harmlezz所述,您应使用ToIntFunction<T>
或任何其他“ toPrimitiveType ”函数,如果您的方法未返回任何值,请使用Consumer<T>
。
但是为了完成 - 并且出于好奇,可能的是:
正如您所注意到的,java中有一个Void
类,您可以定义一个返回Void
的函数:
Function<Long,Void> f = i -> {
System.out.println(i);
return ???;
};
当然你可以返回null
,但这会导致令人讨厌的NullPointerExceptions,例如这不起作用
f.apply(123L).toString();
您无法创建Void
个实例 - 除非您使用反射:)
所以让我们创建一个VOID文字(假设安全设置不禁止它)
static Void VOID;
static {
try {
Constructor<Void> vc = Void.class.getDeclaredConstructor();
vc.setAccessible(true);
VOID = vc.newInstance();
} catch (Exception e) {
throw new Error(e);
}
}
现在你只需在函数中返回这个文字:
Function<Long,Void> f = i -> {
System.out.println(i);
return VOID;
};
函数应用程序将导致类型为Void
的非null结果System.out.println(f.apply(123L).getClass());
打印出来:
123
class java.lang.Void
但是,除非您想展示无意义的边缘情况,否则千万不要在代码中使用它;)