在使用 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)
不需要从可选对象中提取结果只是为了再次用可选对象包装它。
这是毫无意义的,如果结果不存在,将会触发
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());
Optional.ifPresent()
(ifPresentOrElse
在 JDK 8 中不可评估),它将覆盖条件逻辑的 if
部分。要覆盖
else
部分(*为空可选的情况),您需要一个条件。
Optional<Policy> policy = getPolicy(updatedPolies,policykey);
policy.ifPresent(policy -> doSomething(policy));
if (!policy.isPresent()) doSomethingElse();
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);