gpt4 book ai didi

java - 如何处理可选类型列表数据中的数据值

转载 作者:行者123 更新时间:2023-12-02 09:40:32 31 4
gpt4 key购买 nike

我想简化我的代码而不使用太多的 If-Else 条件。我想要的业务逻辑是:

  • 我从数据库检索了客户帐户的数据
  • 我想检查每个客户是否有资格申请新产品
  • 如果她/他有该帐户,则通过
  • 否则失败。

存储库

public interface MyRepository extends JpaRepository<Account, String>{   
Optional<List<Account>> findAcctByCustoNo(String custNo);
}

逻辑代码

Optional<List<Account>> accounts = myRepo.findAcctByCustoNo(auth.getCustNo());
if(!accounts.isPresent()) {
return "invalid param";
}

accounts.ifPresent(list->list.stream()
.filter(type -> type.getAccCd().equals("typeA") || type.getAccCd().equals("typeB"))
.forEach(System.out::println));

代码尚未完成。我需要检查,过滤数据后,如果它仍然返回空值,我想返回“无数据”消息,类似这样。或者应用其他方法或其他。而且我不知道如何正确地做到这一点。因为我能想到的是在过滤后添加创建新实例,并再次使用 isPresent 检查它。但我有一种感觉,我可以在 accounts 实例中完成此操作。请赐教。

我最近才使用这个可选功能。我花了很多时间去理解里面的方法。我正在考虑使用 map ,但同样,我不知道如何以正确的方式实现它。

最佳答案

这个怎么样?进行所有您想要的过滤,然后使用 findAny (比 count() 便宜,因为一旦匹配就会停止)并检查结果

Optional<List<Account>> accounts = myRepo.findAcctByCustoNo(auth.getCustNo());

return accounts //
.map(List::stream) //
.orElseGet(Stream::empty) //
.filter(type -> type.getAccCd().equals("typeA") || type.getAccCd().equals("typeB")) //
.findAny() //
.orElse(null)
!= null;

说明

将可选列表映射到流

如果没有,则使用空流

然后,过滤所有你想要的

找到任何吗?我们很好。

否则,返回 null

最后,检查是否为 null。

在更简单的数据上测试代码:

@Test
public void test_checkArray() {

Assert.assertFalse(this.checkArray(null));
Assert.assertFalse(this.checkArray(Arrays.asList()));
Assert.assertFalse(this.checkArray(Arrays.asList("not a!", "b", "c")));
Assert.assertTrue(this.checkArray(Arrays.asList("a", "b", "c")));
}

private boolean checkArray(final List<String> a) {

return Optional //
.ofNullable(a) //
.map(List::stream) //
.orElseGet(Stream::empty) //
.filter(aa -> "a".equals(aa)) //
.findAny() //
.orElse(null)
!= null;
}

关于java - 如何处理可选类型列表数据中的数据值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57110849/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com