如何在Java中使用Optional类来防止NoSuchElementException[重复]

问题描述 投票:0回答:2

在使用 Stream API 过滤用户定义的类类型列表时,遇到了某些情况,在给定条件下,在list中找不到任何元素。

如何防止这种情况下的异常,并使用可选类根据业务逻辑进行处理?

Stream API 方法如下所示:

public static Optional<Policy> getPolicy(ReturnTermPolicy policyType, 
                                         String policyKey) {
    
    Optional<Policy> policy = Optional.of(policyType.getPolicies().stream()
        .filter(temp -> temp.getPolicyKey().equals(policyKey))
        .findFirst().get());
    
    return policy;
}

调用代码如下所示:

Optional<Policy> updatedPolicyOptional = getPolicy(updatedPolies,policykey); // <- exception is being generated here

if (updatedPolicyOptional.isPresent()) {
    // business logic
}
else {
    // business logic
}

输出:

Verify audit report for update made in TC_08
java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Optional.java:135)
java java-8 java-stream option-type nosuchelementexception
2个回答
3
投票

不需要从可选对象中提取结果只是为了再次用可选对象包装它。

这是毫无意义的,如果结果不存在,将会触发

NoSuchElementException
。要解决这个问题,请删除对
get()
的调用,在这种情况下它既不安全又多余:

public static Optional<Policy> getPolicy(ReturnTermPolicy policyType, 
                                         String policyKey) {
    
    return policyType.getPolicies().stream()
        .filter(temp -> temp.getPolicyKey().equals(policyKey))
        .findFirst();
}

为了流畅地实现条件逻辑,您可以使用

Optional.ifPresentOrElse()
,它期望在结果存在时执行
Consumer
,并在可选为空的情况下触发
Runnable
。请注意,此方法可通过 Java 9 访问。

getPolicy(updatedPolies,policykey)
    .ifPresentOrElse(policy -> doSomething(policy), 
                     () -> doSomethingElse());

使用 Java 8,您可以使用期望消费者的 only

Optional.ifPresent()
ifPresentOrElse
在 JDK 8 中不可评估),它将覆盖条件逻辑的
if
 部分。要覆盖
else
部分(*为空可选的情况),您需要一个条件。

Optional<Policy> policy = getPolicy(updatedPolies,policykey); policy.ifPresent(policy -> doSomething(policy)); if (!policy.isPresent()) doSomethingElse();
    

1
投票

findFirst()

 已经返回了 
Optional
,尝试 
get()
 当它为空时会导致错误。所以你的函数应该是:

public static Optional<Policy> getPolicy(ReturnTermPolicy policyType, String policyKey) { return = policyType.getPolicies().stream() .filter(temp -> temp.getPolicyKey().equals(policyKey)) .findFirst(); }
根据您的 Java 版本(

您的业务逻辑),您可以使用以下内容:

Java 8。

if (updatedPolicyOptional.isPresent()) { // business logic } else { // business logic }

T value = updatedPolicyOptional(mapToTFunctor).orElse(someTValue);

Java 9。

updatedPolicyOptional.ifPresentOrElse(someConsumer,someNoParamFunctor);
    
© www.soinside.com 2019 - 2024. All rights reserved.