将选项列表收集到包含当前选项的列表

tan*_*nvi 10 java java-8 java-stream collectors

我正在尝试重构一些代码以返回可选列表而不是可选。

我的班级有以下清单

private final List<Mapper<? extends Message>> mappers;
Run Code Online (Sandbox Code Playgroud)

有一个私有方法可以为这些映射器创建特征并返回消息列表

private List<Message> mapToFeature() {
        mappers.stream()
                .map(mapper -> mapper.createFeature())
                .collect(Optionals.toList());
}
Run Code Online (Sandbox Code Playgroud)

Mapper 的界面如下所示:

public interface Mapper<T extends Message> {
    Optional<T> createFeature();
}
Run Code Online (Sandbox Code Playgroud)

Optionals.toList()方法返回一个收集器以将当前选项过滤到列表中。

我想更改接口(以及所有相应的类)以返回可选列表

public interface Mapper<T extends Message> {
    List<Optional<T>> createFeature();
}
Run Code Online (Sandbox Code Playgroud)

我在Options util 中没有方法从多个列表中过滤当前选项。我如何能够在不对 util 类进行任何更改的情况下执行相同的操作?

Pie*_*nry 15

将 s流收集Optional到仅包含当前值的列表:

List<Optional<String>> someStrings = ...;

List<String> allPresentStrings = someStrings.stream()
    .flatMap(Optional::stream)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


tpd*_*pdi 0

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());
Run Code Online (Sandbox Code Playgroud)