3 回答
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";
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(). 但前者的缺点是它会遍历所有错误,而后者如果发现任何错误就会短路。
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";
添加回答
举报