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

Good way to convert Optional<Integer> to Optional<Long>

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

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

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

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

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

但这很麻烦,尤其是考虑到当我使用原始类型时转换类型是多么容易。

有什么好主意吗?

TL;DR: 在 Java 7, No.

遗憾的是,这是最好的 Java 7 在功能支持方面必须提供的。

我只想说 transform 永远不会用 null 调用,所以你可以这样做:

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

来自 the documentation:

If the instance is present, it is transformed with the given Function; otherwise, absent() is returned. If the function returns null, a NullPointerException is thrown.

所以从来没有 return nullFunction 传递给 transform.

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

public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

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

然后:

optionalInt.transform(IntToLong.INSTANCE);

这显然减少了调用站点的代码,但代价是在代码库中增加了额外的 类 - 我不太担心这一点。

接近演员表:

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

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