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



在Java 8中,有一个类似于函数点的功能(java.util.function.Function)。通常是这样使用的:Function<LookupKey,LookupResult>,但是,如果该方法返回原始类型,则存在问题。Function<ArgType,Void.TYPE>不起作用,它无法使用非常令人困惑的错误消息进行编译("找不到符号Void.TYPE")。我宁愿避免更改我的方法返回Object只是为了通过NULL。

如果您的函数不返回值,请考虑使用Consumer<T>代替。

如果您的功能应返回ìntlong考虑使用返回原始类型的ToIntFunction<T>ToLongFunction<T>

如果您的功能应返回boolean,请使用Predicate<T>

最后,如果您需要消耗原始类型,但要返回参考类型,请使用IntFunction<T>LongFunction<T>

完成列表:IntToLongFunctionLongToIntFunctionIntUnaryOperatorLongUnaryOperator支持要消费和返回的原始类型。

改用消费者界面。一个不返回任何内容的过程不是"函数"。

如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

的非零结果结果
System.out.println(f.apply(123L).getClass());

打印出来:

123
class java.lang.Void

但是,除非您要演示毫无意义的边缘案例,否则切勿在代码中使用它;)

最新更新