为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Java 8 功能在列表中搜索非空列表

使用 Java 8 功能在列表中搜索非空列表

qq_花开花谢_0 2022-05-12 15:13:14
我有一个代码片段,我想使用 Java 8 功能(如 lambdas/streams 等)使其更简洁易读。基本上,有一个项目列表,每个项目都有一个错误列表。如果至少有一项至少有一项错误,则需要返回“失败”。如果没有项目有任何错误,则返回“成功”。Optional<List<Item>> optionalItemList = Optional.ofNullable(message.getItems());if (optionalItemList.isPresent())    for (Item item : optionalItemList.get()) {        Optional<List<Error>> optionalErrorList = Optional.ofNullable((item.getErrors()));        if(optionalErrorList.isPresent())            if (!optionalErrorList.get().isEmpty()) {                return "failure";            }        }        return "success";
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

Optional不是要替换if语句,而是用作方法的返回值。所以我认为你最好不要用它来完成这个任务。您可以同时使用三元运算符Stream.allMatch:


return message.getItems() == null || 

       message.getItems().stream()

              .allMatch(i -> i.getErrors() == null || i.getErrors().isEmpty()) ?

      "success" :

      "failure";

附带说明一下,方法永远不应该返回null集合。元素的缺失应该通过返回空集合来表示。这将使您的代码更容易:


return message.getItems().stream().allMatch(i -> i.getErrors().isEmpty()) ?

      "success" :

      "failure";


查看完整回答
反对 回复 2022-05-12
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您可以使用flatMap在列表中搜索列表。我个人认为 a不List应该是,而是应该是一个空列表。如果这是保证,那么代码可能是这样的:null


boolean hasError = message.getItems().stream()

    .flatMap(t -> t.getErrors().stream())

    .findAny()

    .isPresent();

return (hasError ? "success" : "failure");

否则,代码会变长一点:


boolean hasError = Optional.ofNullable(message.getItems()).orElse(List.of()).stream()

    .flatMap(t -> Optional.ofNullable(t.getErrors()).orElse(List.of()).stream())

    .findAny()

    .isPresent();

return (hasError ? "success" : "failure");

请注意,我也可以使用.count() > 0而不是.findAny().isPresent(). 但前者的缺点是它会遍历所有错误,而后者如果发现任何错误就会短路。


查看完整回答
反对 回复 2022-05-12
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

对我来说,你把它弄得太复杂了。这是一种更简单的方法。getItems()如果没有要返回的项目,请确保您的 方法返回一个空列表,这样您就可以省去上述额外的空检查。这种方法不太容易出错,并导致更易读的代码。如果你可以对getErrors上面的方法做同样的事情,你就可以省去filter(Objects::nonNull)and ,这将进一步简化流处理管道。


String errorPresent = message.getItems().stream()

    .map(Item::getErrors).filter(Objects::nonNull)

    .map(List::size).filter(s -> s > 0)

    .findAny().map(ignored -> "failure")

    .orElse("success");

或者,您可以使用三元运算符来完成此操作。


String errorPresent = message.getItems().stream()

    .map(Item::getErrors)

    .filter(Objects::nonNull)

    .anyMatch(e -> !e.isEmpty()) ? "failure" : "success";


查看完整回答
反对 回复 2022-05-12
  • 3 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信