将Optional <integer>转换为Optional <long>的好方法

时间:2015-06-09 10:50:27

标签: java java-7 guava optional

我正在尝试找到一种干净且代码高效的方法,将Optional<Integer>转换为Optional<Long>。我正在使用Guava在Java 7中工作。

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

    Optional<Integer> optionalInt = Optional.fromNullable(someInt);

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

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

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

那里有什么好主意吗?

2 个答案:

答案 0 :(得分:20)

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();
    }
});

来自the documentation

  

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

所以从不从传递给null的{​​{1}}返回Function

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

enum

然后:

public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

    @Override
    public Long apply(Integer input) {
        return input.longValue();
    }
}

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

答案 1 :(得分:3)

接近演员:

Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ?
     optionalInt.get().longValue() : null);

基本上这可以避免调用转换的开销。调用isPresent可以简化为直接检查null的值。