我想简化我的代码而不使用过多的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));
代码尚未完成。我需要在过滤数据后检查是否仍返回null值,我想返回“ No Data”消息,类似这样。或应用其他方法。
而且我不知道该怎么做。因为我能想到的是添加过滤后创建新实例,然后再次使用isPresent进行检查。但是我有一种可以在accounts
实例内完成的感觉。
请赐教。
我最近才使用此可选功能。我花了很多时间来了解其中的方法。我当时想利用地图,但同样,我也不知道如何以正确的方式实施地图。
答案 0 :(得分:0)
您可以像这样重新排列代码
Optional.of(myRepo.findAcctByCustoNo(auth.getCustNo()))
.filter(.....)
.orElse(......);
可选方法返回Optional对象,因此它允许方法链接。
答案 1 :(得分:0)
那呢? 进行所需的所有过滤,然后使用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;
说明
将您的可选列表映射到流
如果没有,请使用空流
然后,过滤所有所需内容
findAny?我们很好。
否则,返回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;
}
答案 2 :(得分:0)
不确定您打算如何使用此信息,但是如果您只需要查看客户是否符合条件,则可以尝试
boolean qualify = accounts.stream()
.filter(type -> type.getAccCd().equals("typeA") || type.getAccCd().equals("typeB"))
.findFirst()
.isPresent();
如果客户符合条件,则返回true,否则返回false。