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

How to handle data value inside Optional type of List data

我想在不使用太多 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));

代码还没有完成。我需要检查,过滤数据后,如果它仍然是 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 为真,否则为假。