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

时间:2019-07-19 10:47:31

标签: java java-8 functional-programming optional

我想简化我的代码而不使用过多的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实例内完成的感觉。 请赐教。

我最近才使用此可选功能。我花了很多时间来了解其中的方法。我当时想利用地图,但同样,我也不知道如何以正确的方式实施地图。

3 个答案:

答案 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。