我正在尝试找到一种干净且代码有效的方法来在guava中应用transform方法以创建一个对象,我正在使用带有Guava的Java 8。
在代码的一个地方,我有一个可选的创建。
Optional<Object> optional = Optional.of(objFromDatabase)
在另一个区域,我正在尝试使用此可选项创建一个新对象。我能想到的最好的事情是
if (optional.isPresent()) {
Object obj = optional.get();
NewObject newObj = obj.createNewObj(); //throws IOException, newobj to be returned
} else { throw new IOException() }
但这很麻烦,我希望学习更多关于optionals和lambda表达式的知识。
那里有什么好主意吗?
答案 0 :(得分:3)
没有人真正给出了代码答案,所以这是一个。
首先,创建一个映射对象并处理已检查异常的方法(通过将其包装在未经检查的异常中)。
private NewObject uncheckedCreateNewObject(Object o) {
try {
return o.createNewObject();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
然后,只需进行法线贴图:
NewObject newObject = Optional.of(objFromDatabase).toJavaUtil()
.map(this::uncheckedCreateNewObject)
.orElseThrow(IOException::new);
答案 1 :(得分:1)
如果可能,请尝试摆脱代码库中Guava的Optional`s。 它们是在Oracle的Optional之前设计的。在这种情况下,将更容易使用Stream API。 混合它们是不好的做法。
答案 2 :(得分:1)
如果你真的不想将Guava Optional
交换到JDK&#39; Optional
(但你应该),你可以使用帮助toJavaUtil()
方法进行操作它的API:
guavaOptional.toJavaUtil()
.map(obj -> obj.createNewObj())
.orElseThrow(IOException::new);
修改强>
如果您的createNewObj()
方法抛出已检查异常(此处为:IOException
),您显然无法放入lambda表达式而不首先使用未经检查的异常包装它(例如。{{3} })。
答案 3 :(得分:0)
使用带有Optional的orEsleThrow
方法。试试这个:
NewObject obj = Optional.ofNullable(objFromDatabase)
.map(o -> o.createNewObj())
.orElseThrow(IOException::new)