你实际上并不需要使用Optional
.在映射到可能为空的对象后,到处只有filter(Objects:nonNull)
.这会过滤掉所有为空的内容
// assuming request itself is not null
final List<InnerItem> innerItem = request.stream()
.filter(Objects:nonNull) // list elements might be null
.map(RequestSlot::getOuterItem)
.filter(Objects:nonNull) // outer item might be null
.map(OuterItem::getInnerItem)
.filter(Objects:nonNull) // inner items list might be null
.flatMap(Collection::stream) // innerItemList -> innerItemList.stream()
.filter(Objects:nonNull) // inner item list might contain nulls
.toList();
如果您真的想使用Stream.ofNullable
,请使用模式flatMap(x -> Stream.ofNullable(x.getX()))
(其中getX
可能返回NULL).
final List<InnerItem> innerItem = request.stream()
.filter(Objects:nonNull) // list elements might be null
.flatMap(requestSlot -> Stream.ofNullable(requestSlot.getOuterItem())) // outer item might be null
.flatMap(outerItem -> Stream.ofNullable(outerItem.getInnerItem())) // inner item list might be null
.flatMap(Collection::stream) // innerItemList -> innerItemList.stream()
.filter(Objects:nonNull) // inner item list might contain nulls
.toList();