首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Optional<Integer>转换为Optional<Long>的好方法

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

Stack Overflow用户
提问于 2015-06-09 18:50:27
回答 2查看 13.5K关注 0票数 23

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

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

代码语言:javascript
复制
    Optional<Integer> optionalInt = Optional.fromNullable(someInt);

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

代码语言:javascript
复制
    Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
        @Override
        public Long apply(Integer inputInt) {
            if (inputInt != null)
                return inputInt.longValue();
            else
                return null;
        }
    });

但是这很麻烦,特别是当我使用原始类型时,你会发现转换类型是多么的容易。

有什么好主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-09 18:56:10

TL;DR:在Java 7中,No.

遗憾的是,就函数支持而言,这是Java7提供的最好的功能。

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

代码语言:javascript
复制
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
    @Override
    public Long apply(Integer inputInt) {
        return inputInt.longValue();
    }
});

来自the documentation

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

所以永远不会从传递给transformFunction中返回null

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

代码语言:javascript
复制
public enum IntToLong implements Function<Integer, Long> {

    INSTANCE;

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

然后:

代码语言:javascript
复制
optionalInt.transform(IntToLong.INSTANCE);

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

票数 21
EN

Stack Overflow用户

发布于 2015-06-09 19:07:23

接近演员阵容:

代码语言:javascript
复制
Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ?
     optionalInt.get().longValue() : null);

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30729925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档