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



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

我的课上有以下清单

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类进行任何更改的情况下,我如何能够做到这一点?

Optionals流收集到仅包含当前值的列表中:

List<Optional<String>> someStrings = ...;
List<String> allPresentStrings = someStrings.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());

由于无法正确理解您的问题,如果您能发布您的util类,那就更好了,同时查看我的建议:

private List<Message> mapToFeature() {
return 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());

最新更新