转换可选<Integer>到可选<长>的好方法TL;DR:在 Java 7 中,没有。

2022-09-01 23:31:20

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

因此,在代码中的一个位置,我创建了一个可选整数

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

但是这很麻烦,特别是如果你考虑到当我使用基元类型时转换类型是多么容易。

有什么好主意吗?


答案 1

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

可悲的是,这是Java 7在支持功能方面所能提供的最好的。

我只想说,这永远不会被调用,所以你可以做:transformnull

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

文档中

如果实例存在,则使用给定的 ;否则,将返回。如果函数返回 ,则抛出 a。Functionabsent()nullNullPointerException

所以永远不要从传递到.nullFunctiontransform

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

public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

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

然后:

optionalInt.transform(IntToLong.INSTANCE);

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


答案 2

接近演员阵容:

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

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


推荐