将Optional <Integer>转换为Optional <Long>的好方法

dro*_*sun 21 java optional guava java-7

我试图找到一种干净,代码高效的转换Optional<Integer>方式Optional<Long>.我正在使用Guava在Java 7中工作.

所以在代码中的一个地方我创建了一个可选的整数

    Optional<Integer> optionalInt = Optional.fromNullable(someInt);
Run Code Online (Sandbox Code Playgroud)

在另一个领域,我需要它作为一个可选的长.我能想到的最好的事情是:

    Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
        @Override
        public Long apply(Integer inputInt) {
            if (inputInt != null)
                return inputInt.longValue();
            else
                return null;
        }
    });
Run Code Online (Sandbox Code Playgroud)

但这很麻烦,特别是如果你考虑在我使用原始类型时转换类型是多么容易.

有什么好主意吗?

Bor*_*der 21

TL; DR:在Java 7中,没有.

遗憾的是,这是Java 7在功能支持方面所能提供的最佳功能.

我只想说transform永远不会被召唤null所以你可以这样做:

Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
    @Override
    public Long apply(Integer inputInt) {
        return inputInt.longValue();
    }
});
Run Code Online (Sandbox Code Playgroud)

文档:

如果实例存在,则使用给定的转换 Function; 否则,absent()退回.如果函数返回 null,NullPointerException则抛出a.

所以永远不要nullFunction传递回来transform.

如果你重复使用它,那么你可以使用enum单例模式:

public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

    @Override
    public Long apply(Integer input) {
        return input.longValue();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

optionalInt.transform(IntToLong.INSTANCE);
Run Code Online (Sandbox Code Playgroud)

这显然减少了调用站点的代码,代价是在代码库中有额外的类 - 我不会太担心.