[英]Collecting lists of optionals to a list containing present optionals
我正在嘗試重構一些代碼以返回一個可選列表而不是一個可選列表。
我的班級有以下清單
private final List<Mapper<? extends Message>> mappers;
有一個私有方法可以為這些映射器創建特征並返回消息列表
private List<Message> mapToFeature() {
mappers.stream()
.map(mapper -> mapper.createFeature())
.collect(Optionals.toList());
}
Mapper 界面如下所示:
public interface Mapper<T extends Message> {
Optional<T> createFeature();
}
Optionals.toList()
方法返回一個收集器以將當前的選項過濾到一個列表中。
我想更改接口(以及所有相應的類)以返回可選列表
public interface Mapper<T extends Message> {
List<Optional<T>> createFeature();
}
我在 Optionals util 中沒有從多個列表中過濾當前選項的方法。 我如何在不對 util 類進行任何更改的情況下執行相同操作?
由於無法正確理解你的問題,如果你能同時發布你的 util 類會更好,同時看看我的做法:
private List<Message> mapToFeature() {
mappers.stream()
.map(mapper -> mapper.createFeature())
.flatMap(List::stream)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Optionals.toList());
}
Stream<Optional<T>> present = listOfOptionals.stream().filter(Optional::isPresent);
Stream<T> asTs = present.map(Optional::get);
// this is safe, because all remaining are present,
//convert Streams to Lists as usual with collect.
List<T> listTs = asTs.collect(Collectors.toList());
將Optional
流收集到僅包含當前值的列表中:
List<Optional<String>> someStrings = ...;
List<String> allPresentStrings = someStrings.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.