如何解决将复杂逻辑转换为流/可选
我正在尝试将以下代码(很多if / for / null检查)转换为流/可选。尝试了一段时间,但无法解决问题。任何帮助,将不胜感激!谢谢
String id = null;
String res = null;
List<ShoppingCandidate> shoppingCandidates = null;
List<DiscoveredIdentity> discoveredIdentityList = null;
Optional<DiscoveredIdentities> discoveredIdentities = contextAccessor.maybeAccess(DiscoveredIdentities.class);
Optional<DiscoveredShoppingCandidates> discoveredShoppingCandidates = contextAccessor.maybeAccess(DiscoveredShoppingCandidates.class);
if(discoveredShoppingCandidates.isPresent()){
shoppingCandidates = discoveredShoppingCandidates.get().getShoppingCandidates();
}
if(shoppingCandidates != null){
for(ShoppingCandidate shoppingCandidate : shoppingCandidates){
if(shoppingCandidate.getIdentityReferenceList() != null){
for(IdentityReference identityReference : shoppingCandidate.getIdentityReferenceList()){
if(identityReference.getIdRole().equals("123")){
id = identityReference.getReferenceId();
}
}
}
}
}
if(discoveredIdentities.isPresent()){
discoveredIdentityList = discoveredIdentities.get().getDiscoveredIdentityList();
if(discoveredIdentityList != null){
for(DiscoveredIdentity discoveredIdentity : discoveredIdentityList){
if(discoveredIdentity.getIdentityId().equals(id)){
List<IdentityKey> identityKeyList = discoveredIdentity.getIdentityKeyList();
if(identityKeyList != null){
for(IdentityKey key: identityKeyList){
if(key.getIdType().equals("CID")){
res = key.getId();
}
}
}
}
}
}
}
解决方法
您的代码不安全,只要您可能将id
改成null
,随后基于它的检查将是无效的。
也使用Optional::isPresent
只是程序if-else
的伪装。你能找到区别吗?
if (something != null) {
// use something
}
if (optionalSomething.isPresent()) {
// use optionalSomething.get();
}
没有区别。 Optional
的功能在于使用链接方法,例如map
,flatMap
,filter
,orElse
等。
如果您尝试根据正确的if-else-for-each
用法将过程Optional
代码“转换”为某种代码,则可能会产生如下所示的结果。尽管使用了正确的方法,但它仍然非常笨拙且诚实,尽管存在差异,但差异并不明显。只要结构和逻辑复杂,可维护性仍然受到质疑。
我认为Optional
在这种情况下不会帮助您实现可维护性和清晰度。您获得的唯一好处是处理了找不到id
(即null
)的情况。
我建议您将逻辑部分提取到单独的方法中,以实现简洁的代码。
最后,看一看(未经测试,但可以给您一个想法):
String res = discoveredShoppingCandidates
.map(DiscoveredShoppingCandidates::getShoppingCandidates)
.orElse(Collections.emptyList())
.stream()
.map(ShoppingCandidate::getIdentityReferenceList)
.filter(Objects::nonNull)
.flatMap(Arrays::stream)
.filter(s -> "123".equals(s.getIdRole()))
.map(IdentityReference::getReferenceId)
.flatMap(id -> discoveredIdentities
.map(DiscoveredIdentities::getDiscoveredIdentityList)
.orElse(Collections.emptyList())
.stream()
.filter(s -> Objects.equals(id,s.getIdentityId()))
.flatMap(s -> s.getIdentityKeyList().stream())
.filter(Objects::nonNull)
.filter(s -> "CID".equals(s.getIdType()))
.map(IdentityKey::getId))
.findFirst()
.orElse(null);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。