我正在尝试寻找一种干净且代码高效的方法来将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;
}
});但是这很麻烦,特别是当我使用原始类型时,你会发现转换类型是多么的容易。
有什么好主意吗?
发布于 2015-06-09 18:56:10
TL;DR:在Java 7中,No.
遗憾的是,就函数支持而言,这是Java7提供的最好的功能。
我只想说,null永远不会调用transform,所以你可以这样做:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
return inputInt.longValue();
}
});来自the documentation
如果实例存在,则使用给定的
Function进行转换;否则,返回absent()。如果函数返回null,则抛出NullPointerException。
所以永远不会从传递给transform的Function中返回null。
如果您经常重用它,那么您可以使用enum单例模式:
public enum IntToLong implements Function<Integer, Long> {
INSTANCE;
@Override
public Long apply(Integer input) {
return input.longValue();
}
}然后:
optionalInt.transform(IntToLong.INSTANCE);这显然减少了调用点的代码,代价是在代码库中有额外的类-这是我不太担心的事情。
发布于 2015-06-09 19:07:23
接近演员阵容:
Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ?
optionalInt.get().longValue() : null);基本上,这避免了调用transform的开销。调用isPresent可以简化为直接检查null的值。
https://stackoverflow.com/questions/30729925
复制相似问题