3 回答

TA貢獻1775條經(jīng)驗 獲得超8個贊
Optional不是要替換if語句,而是用作方法的返回值。所以我認為你最好不要用它來完成這個任務(wù)。您可以同時使用三元運算符Stream.allMatch:
return message.getItems() == null ||
message.getItems().stream()
.allMatch(i -> i.getErrors() == null || i.getErrors().isEmpty()) ?
"success" :
"failure";
附帶說明一下,方法永遠不應(yīng)該返回null集合。元素的缺失應(yīng)該通過返回空集合來表示。這將使您的代碼更容易:
return message.getItems().stream().allMatch(i -> i.getErrors().isEmpty()) ?
"success" :
"failure";

TA貢獻1794條經(jīng)驗 獲得超8個贊
您可以使用flatMap在列表中搜索列表。我個人認為 a不List應(yīng)該是,而是應(yīng)該是一個空列表。如果這是保證,那么代碼可能是這樣的: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(). 但前者的缺點是它會遍歷所有錯誤,而后者如果發(fā)現(xiàn)任何錯誤就會短路。

TA貢獻1828條經(jīng)驗 獲得超6個贊
對我來說,你把它弄得太復(fù)雜了。這是一種更簡單的方法。getItems()如果沒有要返回的項目,請確保您的 方法返回一個空列表,這樣您就可以省去上述額外的空檢查。這種方法不太容易出錯,并導(dǎo)致更易讀的代碼。如果你可以對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";
添加回答
舉報