簡體   English   中英

將選項列表收集到包含當前選項的列表中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM