Java 8:无法在基本类型void上调用orElseThrow()

时间:2017-05-12 15:02:11

标签: java java-8

我正在尝试以下代码:

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()引发的异常。我无法理解同样的原因。

4 个答案:

答案 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());