«ошибка: несовместимые типы: переменная логического вывода R имеет несовместимые границы», когда flatMap поток в одной строке - PullRequest
0 голосов
/ 26 октября 2018

У меня есть пользовательский класс Custom.

public class Custom {

  private Long id;

  List<Long> ids;

  // getters and setters
}

Теперь у меня есть List<Custom> объектов. Я хочу конвертировать List<Custom> в List<Long>. Я написал код, как показано ниже, и он работает нормально.

    List<Custom> customs = Collections.emptyList();
    Stream<Long> streamL = customs.stream().flatMap(x -> x.getIds().stream());
    List<Long> customIds2 = streamL.collect(Collectors.toList());
    Set<Long> customIds3 = streamL.collect(Collectors.toSet());

Теперь я объединяю line2 и line3 в одну строку, как показано ниже.

    List<Long> customIds = customs.stream().flatMap(x -> x.getIds().stream()).collect(Collectors.toSet());

Теперь этот код не компилируется, и я получаю ошибку ниже -

    error: incompatible types: inference variable R has incompatible bounds
            List<Long> customIds = customs.stream().flatMap(x -> x.getIds().stream()).collect(Collectors.toSet());
                                                                                            ^
        equality constraints: Set<Long>
        upper bounds: List<Long>,Object
    where R,A,T are type-variables:
        R extends Object declared in method <R,A>collect(Collector<? super T,A,R>)
        A extends Object declared in method <R,A>collect(Collector<? super T,A,R>)
        T extends Object declared in interface Stream

Как мне правильно преобразовать List<Custom> в Set<Long> или List<Long>

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы можете сделать это как:

List<Custom> customs = Collections.emptyList();
Set<Long> customIdSet = customs.stream()
                               .flatMap(x -> x.getIds().stream())
                               .collect(Collectors.toSet()); // toSet and not toList

Причина, по которой вы получаете ошибку компилятора, заключается в том, что вы использовали неверный Collector, который возвращает List вместо Set, который является вашим ожидаемым типом возврата, когда вы присваиваете его переменной Set<Long> type.

0 голосов
/ 26 октября 2018

Это должно сработать:

Set<Long> collectSet = customs.stream()
                           .flatMap(x -> x.getIds().stream())
                           .collect(Collectors.toSet());

Вы пытаетесь преобразовать Set в List, что невозможно.

...