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

我有一个代码片段,我想使用 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";


qq_花开花谢_0
浏览 145回答 3
3回答

www说

Optional不是要替换if语句,而是用作方法的返回值。所以我认为你最好不要用它来完成这个任务。您可以同时使用三元运算符Stream.allMatch:return message.getItems() == null ||&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;message.getItems().stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .allMatch(i -> i.getErrors() == null || i.getErrors().isEmpty()) ?&nbsp; &nbsp; &nbsp; "success" :&nbsp; &nbsp; &nbsp; "failure";附带说明一下,方法永远不应该返回null集合。元素的缺失应该通过返回空集合来表示。这将使您的代码更容易:return message.getItems().stream().allMatch(i -> i.getErrors().isEmpty()) ?&nbsp; &nbsp; &nbsp; "success" :&nbsp; &nbsp; &nbsp; "failure";

幕布斯7119047

您可以使用flatMap在列表中搜索列表。我个人认为 a不List应该是,而是应该是一个空列表。如果这是保证,那么代码可能是这样的:nullboolean hasError = message.getItems().stream()&nbsp; &nbsp; .flatMap(t -> t.getErrors().stream())&nbsp; &nbsp; .findAny()&nbsp; &nbsp; .isPresent();return (hasError ? "success" : "failure");否则,代码会变长一点:boolean hasError = Optional.ofNullable(message.getItems()).orElse(List.of()).stream()&nbsp; &nbsp; .flatMap(t -> Optional.ofNullable(t.getErrors()).orElse(List.of()).stream())&nbsp; &nbsp; .findAny()&nbsp; &nbsp; .isPresent();return (hasError ? "success" : "failure");请注意,我也可以使用.count() > 0而不是.findAny().isPresent(). 但前者的缺点是它会遍历所有错误,而后者如果发现任何错误就会短路。

30秒到达战场

对我来说,你把它弄得太复杂了。这是一种更简单的方法。getItems()如果没有要返回的项目,请确保您的 方法返回一个空列表,这样您就可以省去上述额外的空检查。这种方法不太容易出错,并导致更易读的代码。如果你可以对getErrors上面的方法做同样的事情,你就可以省去filter(Objects::nonNull)and ,这将进一步简化流处理管道。String errorPresent = message.getItems().stream()&nbsp; &nbsp; .map(Item::getErrors).filter(Objects::nonNull)&nbsp; &nbsp; .map(List::size).filter(s -> s > 0)&nbsp; &nbsp; .findAny().map(ignored -> "failure")&nbsp; &nbsp; .orElse("success");或者,您可以使用三元运算符来完成此操作。String errorPresent = message.getItems().stream()&nbsp; &nbsp; .map(Item::getErrors)&nbsp; &nbsp; .filter(Objects::nonNull)&nbsp; &nbsp; .anyMatch(e -> !e.isEmpty()) ? "failure" : "success";
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java