Сбор списков опций в список, содержащий существующие опционы - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь реорганизовать некоторый код, чтобы он возвращал список необязательных вместо необязательных.

У меня есть следующий список в моем классе

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() возвращает Collector для фильтрации существующих опций в Список.

Я хочу изменить интерфейс (и все соответствующие классы), чтобы он возвращал список опций

public interface Mapper<T extends Message> {
    List<Optional<T>> createFeature();
}

У меня нет метода в утилите Optionals для фильтрации существующих опций из нескольких списков. Как я смогу сделать то же самое, не внося никаких изменений в класс util?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Поскольку вы не в состоянии правильно понять вашу проблему, было бы лучше, если вы опубликуете свой класс утилит, а также посмотрите мои go для этого:

private List<Message> mapToFeature() {
    mappers.stream()
            .map(mapper -> mapper.createFeature())
            .flatMap(List::stream)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Optionals.toList());

}

0 голосов
/ 04 марта 2020
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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...