Java 8 Lambda中如何组合使用三层Stream?代码报错求修正
代码括号缺失问题修复
你的代码存在两个核心问题:
- 括号不匹配:嵌套的lambda表达式缺少3个闭合右括号,每个
map的lambda体都需要正确闭合。 - 流操作误用:嵌套流中使用
map会导致流嵌套(最终得到Stream<Stream<Optional<Human>>>),无法直接提取出Human对象,应该用flatMap扁平化嵌套流。
修正后的完整代码:
Human finded = country.getCities() .stream() .flatMap(cty -> cty.getStreets().stream()) .flatMap(strt -> strt.getHumans().stream()) .filter(hmn -> hmn.getID().equals(wantedID)) .findFirst() .orElse(null);
如果坚持用嵌套写法(可读性差,不推荐),仅补全括号后的代码(仍需处理流嵌套问题):
// 仅补全括号,仍需逐层展开嵌套的Optional才能拿到Human Optional<Optional<Optional<Human>>> nestedOptional = country.getCities() .stream() .map(cty -> cty.getStreets() .stream() .map(strt -> strt.getHumans() .stream() .filter(hmn -> hmn.getID().equals(wantedID)) .findFirst() ) .findFirst() ) .findFirst(); Human finded = nestedOptional.orElse(Optional.empty()).orElse(Optional.empty()).orElse(null);
显然第一种用flatMap的写法更简洁高效,符合流操作的最佳实践。
内容的提问来源于stack exchange,提问作者Non_Est_Illuminatus
相关产品推荐
相关产品推荐

