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

Java 如何处理可选类型列表数据中的数据值,java,java-8,functional-programming,optional,Java,Java 8,Functional Programming,Optional,我想简化我的代码,而不使用太多If-Else条件。 我想要的业务逻辑是: 我从数据库中检索到了客户帐户的数据 我想检查每个客户是否有资格申请新产品 如果她/他有账户,则通过 否则就失败了 存储库 公共接口MyRepository扩展了JpaRepository{ 可选的findAcctByCustoNo(字符串custNo); } 逻辑代码 Optional accounts=myRepo.findAcctByCustoNo(auth.getCustNo()); 如果(!accounts.

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

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

公共接口MyRepository扩展了JpaRepository{ 可选的findAcctByCustoNo(字符串custNo); } 逻辑代码

Optional accounts=myRepo.findAcctByCustoNo(auth.getCustNo());
如果(!accounts.isPresent()){
返回“无效参数”;
}
accounts.ifPresent(list->list.stream()
.filter(type->type.getAccCd().equals(“typeA”)| | type.getAccCd().equals(“typeB”))
.forEach(System.out::println));
代码还没有完成。我需要检查,在过滤数据之后,如果它仍然返回空值,我想返回“No data”消息,类似这样的消息。或者应用另一种方法。 我不知道该怎么做。因为我能想到的是在过滤后添加并创建新实例,然后再次使用isPresent检查它。但我有一种感觉,我可以在
帐户
实例中完成。 请开导我


我最近才使用这个可选功能。我花了很多时间理解其中的方法。我本来想利用map,但我也不知道如何以正确的方式实现它。

您可以像这样重新排列代码

Optional.of(myRepo.findAcctByCustoNo(auth.getCustNo()))
.filter(.....)
.orElse(......);
可选方法返回可选对象,因此它允许方法链接。

这怎么办? 执行所有需要的筛选,然后使用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;
Optional accounts=myRepo.findAcctByCustoNo(auth.getCustNo());
返回帐户//
.map(列表::流)//
.orElseGet(流::空)//
.filter(type->type.getAccCd().equals(“typeA”)| | type.getAccCd().equals(“typeB”))//
.findAny()//
.orElse(空)
!= 无效的
解释

将可选列表映射到流

如果不是,则使用空流

然后,过滤所有你想要的

芬丹?我们很好

orElse,返回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;
}
@测试
公共无效测试_checkArray(){
Assert.assertFalse(this.checkArray(null));
Assert.assertFalse(this.checkArray(Arrays.asList());
Assert.assertFalse(this.checkArray(Arrays.asList(“非a!”、“b”、“c”));
Assert.assertTrue(this.checkArray(Arrays.asList(“a”、“b”、“c”)));
}
专用布尔校验数组(最终列表a){
返回可选//
.可供查阅的文件(a)//
.map(列表::流)//
.orElseGet(流::空)//
.filter(aa->“a”。等于(aa))//
.findAny()//
.orElse(空)
!=null;
}

不确定之后您打算如何使用该信息,但如果您只需要查看客户是否符合条件,您可以尝试

boolean qualify = accounts.stream()
                .filter(type -> type.getAccCd().equals("typeA") || type.getAccCd().equals("typeB"))
                .findFirst()
                .isPresent();

如果客户符合条件,则返回true,否则返回false。

返回字符串
“invalid param”
似乎是一个错误。你的应用程序是。抛出一个异常或什么。我刚刚花了时间格式化你的代码,而你的编辑又破坏了它。请修复它…@Michael我看到了你的修订版,我编辑了修订版。我不明白为什么你的复习不见了。请忽略返回类型,实际上是因为此代码位于返回字符串的方法中。因此,我返回Struts,可以在语句的末尾使用可选的.ORSE()方法,并在ITOFFROST中返回“无数据”:在没有结果的情况下,可以考虑在<代码> FUNCTACTBYCUSTONOO 中返回空列表。这对我来说是有意义的。非常感谢。这很有帮助。看到这个代码后,我有了一个想法!很乐意帮忙。竖起大拇指也不错;)我想,但不幸的是,我的拇指没有被记录和显示:(