我正在尝试找到一种干净且代码高效的方法,将Optional<Integer>
转换为Optional<Long>
。我正在使用Guava在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;
}
});
但这很麻烦,特别是如果你考虑在我使用原始类型时转换类型是多么容易。
那里有什么好主意吗?
答案 0 :(得分:20)
可悲的是,这是Java 7在功能支持方面所能提供的最佳功能。
我只想说永远不会使用transform
调用null
,所以你可以这样做:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
return inputInt.longValue();
}
});
如果实例存在,则使用给定的转换
Function
;否则,返回absent()
。如果函数返回null
,抛出NullPointerException
。
所以从不从传递给null
的{{1}}返回Function
。
如果你重复使用它,那么你可以使用transform
单例模式:
enum
然后:
public enum IntToLong implements Function<Integer, Long> {
INSTANCE;
@Override
public Long apply(Integer input) {
return input.longValue();
}
}
这显然减少了呼叫站点的代码,代价是在代码库中有额外的类 - 我不会太担心。
答案 1 :(得分:3)
接近演员:
Optional<Long> optionalLong = Optional.fromNullable(optionalInt.isPresent() ?
optionalInt.get().longValue() : null);
基本上这可以避免调用转换的开销。调用isPresent可以简化为直接检查null的值。