java – 很好的转换方式可选为可选

我试图找到一个干净和代码有效的方式来转换Optional< Integer>至可选< Long>。我正在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;
        }
    });

但这很麻烦,特别是如果您考虑在使用原始类型时投射类型的容易程度。

有什么好的想法吗?

TL; DR:在Java 7中,No.

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

我只会说,转换将永远不会被调用为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.

所以永远不会从传递给变换的函数返回null。

如果你重复使用了很多,那么你可以使用枚举单例模式:

public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

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

然后:

optionalInt.transform(IntToLong.INSTANCE);

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

翻译自:https://stackoverflow.com/questions/30729925/good-way-to-convert-optionalinteger-to-optionallong

转载注明原文:java – 很好的转换方式可选为可选