如何在Java中使用带原始返回或参数类型的函数?

时间:2017-03-15 05:40:30

标签: generics functional-programming java-8

在Java 8中,有一个类似于函数指针(java.util.function.Function)的功能。它通常使用如下:Function<LookupKey,LookupResult>,但是,如果方法返回基本类型,则会出现问题。 Function<ArgType,Void.TYPE>不起作用,无法使用非常混乱的错误消息进行编译(“找不到符号Void.TYPE”)。我宁愿避免改变我的方法来返回Object只是为了传递null作为结果。

3 个答案:

答案 0 :(得分:7)

如果您的函数不应返回值,请考虑改为使用Consumer<T>

如果您的函数应返回ìntlong,请考虑使用返回基本类型的ToIntFunction<T>ToLongFunction<T>

最后,如果您需要使用基本类型但想要返回引用类型,请使用IntFunction<T>LongFunction<T>

要完成列表:IntToLongFunctionLongToIntFunctionIntUnaryOperatorLongUnaryOperator支持使用和返回原始类型。

答案 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

但是,除非您想展示无意义的边缘情况,否则千万不要在代码中使用它;)