我正在尝试以下代码:
Optional.ofNullable(listEvidence).ifPresent(
eviList -> {
List<String> repoKeysList = new ArrayList<String>();
for (Evidence evidence : eviList) {
repoKeysList.add(evidence.getRepositoryKey());
}
log.debug("UserContentBean: processRepoSyncCleanup repoKeysList - "+repoKeysList);
evidenceDetailDAO.updateIsSelectedFlag(repoKeysList, 0,configurationService.getNodeName());
}
).orElseThrow();
但是我收到以下错误:
Cannot invoke orElseThrow() on the primitive type void
在我看来,orElseThrow()
在代码中放错了地方。但是updateIsSelectedFlag()
抛出了一个需要处理的异常。
此外,这段代码是method1()
的一部分。我尝试将throws Exception添加到method1()
,但它要求我处理updateIsSelectedFlag()
引发的异常。我无法理解同样的原因。
答案 0 :(得分:4)
这似乎是一种糟糕的处理方法。一般来说,在谈到Optional
的使用时,您通常希望将其作为 return 值,而不是您对其进行操作的值。实际上,您仍在进行null
检查;它只是不必要地混淆了。
相反,请执行您要对if
语句执行的操作。
if (null != listEvidence) {
List<String> repoKeysList = new ArrayList<String>();
for (Evidence evidence : listEvidence) {
repoKeysList.add(evidence.getRepositoryKey());
}
log.debug("UserContentBean: processRepoSyncCleanup repoKeysList - " + repoKeysList);
evidenceDetailDAO.updateIsSelectedFlag(repoKeysList, 0, configurationService.getNodeName());
}
有关Optional
围绕对话的更多内容,this Stack Overflow question会详细说明Optional
的用例。
答案 1 :(得分:2)
Optional.ifPresent
会返回void
类型,而不是Optional
本身。
您尝试做的事情应该使用if {listEvidence != null} else {}
阻止。
答案 2 :(得分:0)
正如Jeremy所指出,Optional.ifPresent
会返回void
。此外,您错过了public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
请注意,orElseThrow
永远不会处理updateIsSelectedFlag()
引发的异常。 orElseThrow
的目的是&#34;获取可选项中的值(如果它存在),如果它不存在则抛出异常&#34;。
updateIsSelectedFlag()
Consumer<T>
的参数中使用它, ifPresent
必须抛出未经检查的异常。查看Consumer接口,它不支持已检查的异常。如果updateIsSelectedFlag()
无法抛出未经检查的异常,则必须捕获异常并在RuntimeException
中抛出新的未经检查的异常(例如Consumer
)。
您可以使用Optional.map
代替Optional.ifPResent
并通过修复其余代码(管理异常,将参数添加到orElseThrow
)来实现类似于您所写的内容。但正如许多人所建议的那样,你应该更好地重写代码。现在,你没有写下你打算做的事情。
提示:由于您善于使用Optional
,因此请避免测试null
值。身高
listEvidence = Optional.ofNullable(something);
if (listEvidence.isPresent())
到
if (null != listEvidence)
如果您避免使用null
值,则代码将永远不会抛出NullPointerException
。
答案 3 :(得分:0)
就像其他人所说的那样,在你的情况下,最好只使用if (listEvidence != null)
。
然而,如果您确实需要在其他情况下使用这样的可选项,则可以将其存储在变量中,而不是将所有内容链接在一起。
说listEvidence
的类型为MyClass
。
Optional<MyClass> myOptional = Optional.ofNullable(listEvidence);
myOptional.ifPresent(
eviList -> {
List<String> repoKeysList = new ArrayList<String>();
for (Evidence evidence : eviList) {
repoKeysList.add(evidence.getRepositoryKey());
}
log.debug("UserContentBean: processRepoSyncCleanup repoKeysList - "+repoKeysList);
evidenceDetailDAO.updateIsSelectedFlag(repoKeysList, 0,configurationService.getNodeName());
});
myOptional.orElseThrow(() -> new RuntimeException());