如何处理可选类型的列表数据中的数据值
How to handle data value inside Optional type of List data
我想在不使用太多 If-Else 条件的情况下简化我的代码。
我想要的业务逻辑是:
- 我从数据库中检索了客户账户的数据
- 我想查询每个客户是否有资格申请新产品
- 如果She/He有帐号,则通过
- 否则失败。
存储库
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));
代码还没有完成。我需要检查,过滤数据后,如果它仍然是 return 空值,我想 return "No Data" 消息,像这样。或者应用其他方法。
而且我不知道如何正确地做到这一点。因为我能想到的是在过滤后添加创建新实例,并再次使用 isPresent 检查它。但是我有一种感觉,我可以在 accounts
实例中完成它。
请赐教。
我最近才使用这个可选功能。我花了很多时间去理解里面的方法。我正在考虑使用地图,但同样,我不知道如何以正确的方式实现它。
您可以像这样重新排列代码
Optional.of(myRepo.findAcctByCustoNo(auth.getCustNo()))
.filter(.....)
.orElse(......);
可选方法return可选对象,因此它允许方法链接。
这个呢?
做你想要的所有过滤,然后使用 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;
说明
将您的可选列表映射到流
如果不是,则使用空流
然后,过滤你想要的
找到任何一个?我们很好
orElse, return 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;
}
不确定之后你打算如何使用这些信息,但如果你只是想看看客户是否符合条件,你可以试试
boolean qualify = accounts.stream()
.filter(type -> type.getAccCd().equals("typeA") || type.getAccCd().equals("typeB"))
.findFirst()
.isPresent();
如果客户符合条件,这将 return 为真,否则为假。
我想在不使用太多 If-Else 条件的情况下简化我的代码。 我想要的业务逻辑是:
- 我从数据库中检索了客户账户的数据
- 我想查询每个客户是否有资格申请新产品
- 如果She/He有帐号,则通过
- 否则失败。
存储库
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));
代码还没有完成。我需要检查,过滤数据后,如果它仍然是 return 空值,我想 return "No Data" 消息,像这样。或者应用其他方法。
而且我不知道如何正确地做到这一点。因为我能想到的是在过滤后添加创建新实例,并再次使用 isPresent 检查它。但是我有一种感觉,我可以在 accounts
实例中完成它。
请赐教。
我最近才使用这个可选功能。我花了很多时间去理解里面的方法。我正在考虑使用地图,但同样,我不知道如何以正确的方式实现它。
您可以像这样重新排列代码
Optional.of(myRepo.findAcctByCustoNo(auth.getCustNo()))
.filter(.....)
.orElse(......);
可选方法return可选对象,因此它允许方法链接。
这个呢? 做你想要的所有过滤,然后使用 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;
说明
将您的可选列表映射到流
如果不是,则使用空流
然后,过滤你想要的
找到任何一个?我们很好
orElse, return 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;
}
不确定之后你打算如何使用这些信息,但如果你只是想看看客户是否符合条件,你可以试试
boolean qualify = accounts.stream()
.filter(type -> type.getAccCd().equals("typeA") || type.getAccCd().equals("typeB"))
.findFirst()
.isPresent();
如果客户符合条件,这将 return 为真,否则为假。