dro*_*sun 21 java optional guava java-7
我试图找到一种干净,代码高效的转换Optional<Integer>
方式Optional<Long>
.我正在使用Guava在Java 7中工作.
所以在代码中的一个地方我创建了一个可选的整数
Optional<Integer> optionalInt = Optional.fromNullable(someInt);
Run Code Online (Sandbox Code Playgroud)
在另一个领域,我需要它作为一个可选的长.我能想到的最好的事情是:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
if (inputInt != null)
return inputInt.longValue();
else
return null;
}
});
Run Code Online (Sandbox Code Playgroud)
但这很麻烦,特别是如果你考虑在我使用原始类型时转换类型是多么容易.
有什么好主意吗?
Bor*_*der 21
遗憾的是,这是Java 7在功能支持方面所能提供的最佳功能.
我只想说transform
永远不会被召唤null
所以你可以这样做:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
return inputInt.longValue();
}
});
Run Code Online (Sandbox Code Playgroud)
从文档:
如果实例存在,则使用给定的转换
Function
; 否则,absent()
退回.如果函数返回null
,NullPointerException
则抛出a.
所以永远不要null
从Function
传递回来transform
.
如果你重复使用它,那么你可以使用enum
单例模式:
public enum IntToLong implements Function<Integer, Long> {
INSTANCE;
@Override
public Long apply(Integer input) {
return input.longValue();
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
optionalInt.transform(IntToLong.INSTANCE);
Run Code Online (Sandbox Code Playgroud)
这显然减少了调用站点的代码,代价是在代码库中有额外的类 - 我不会太担心.