Несовместимые типы обобщенных типов Java (не существует ни одного экземпляра (ов) переменных типа) - PullRequest
2 голосов
/ 26 июня 2019

Может показаться, что заголовок вопроса совпадает с другим постом, но его содержание отличается.Поэтому, пожалуйста, не отмечайте его как дубликат.

Проблема :

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

public class SCDTO extends RDTO {
    private List<String> sCPairs = Collections.emptyList();

    public SCDTO(List<String> sCPairs) {
        this.sCPairs = sCPairs;
    }

    //Getter setter

}

Я пытаюсь использоватьниже лямбда-выражения, чтобы установить sCPairs.

sCPairsObject.setSCPairs(util.getSCMap().entrySet().stream().
                        filter(entry -> entry.getValue().contains("abc")).collect(Collectors.toCollection(ArrayList<String>::new)));

Но у меня есть ошибка компиляции:

no instance(s) of type variable(s) exist so that Entry<String, List<String>> conforms to String

util.getSCMap возвращает Map<String, List<String>>.

Может кто-нибудь объяснить, почему это происходит и как это решить?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 26 июня 2019

Ваш потоковый конвейер находит все записи Map, значение которых List<String> содержит String "abc", и пытается собрать их в List<String>.

Вы не указали, как собираетесь преобразовывать каждый элемент Map.Entry<String,List<String>>, который проходит фильтр, в String. В зависимости от требуемой логики, возможно, вы пропускаете шаг map() после фильтра.

Например, если вы хотите собрать все ключи, имеющие значение, которое передает фильтр в List<String>:

 sCPairsObject.setSCPairs(util.getSCMap()
                              .entrySet()
                              .stream()
                              .filter(entry -> entry.getValue().contains("abc"))
                              .map(Map.Entry::getKey)
                              .collect(Collectors.toCollection(ArrayList<String>::new)));
1 голос
/ 26 июня 2019

Вы транслируете записи с карты:

sCPairsObject.setSCPairs(util.getSCMap().entrySet().stream()

Затем отфильтровываем некоторые из них:

.filter(entry -> entry.getValue().contains("abc"))

теперь вам нужно отобразить записи в список, например:

.map(entry -> entry.getValue())

и передавать содержимое всех этих списков в один поток:

.flatMap(List::stream)

Наконец, соберите значения в список:

.collect(Collectors.toList());
0 голосов
/ 26 июня 2019

Поскольку вы хотите преобразовать Map<String, List<String>> в List<String>, где список должен быть объединением всех соответствующих списков значений, вам потребуется flatMap(), чтобы объединить потоки из этих списков значений в один поток.

Кроме того, вам, кажется, не нужны ключи, поэтому просто добавьте значения на карту:

List<String> scPairs = util.getSCMap().values().stream() //stream on the values only
                           .filter( l -> l.contains( "abc" ) ) //filter the lists
                           .flatMap( Collection::stream ) //join the individual streams
                           .collect( Collectors.toList() ); //collect the result into a single list
0 голосов
/ 26 июня 2019

Вам не нужно перебирать entrySet, поскольку вы вообще не используете ключ. Вы можете получить значения Map и отфильтровать их. Похоже на это

sCPairsObject.setSCPairs(util.getSCMap()
   .values()
   .stream()
   .filter(entry -> entry.contains("abc"))
   .flatMap(List::stream)
   .collect(Collectors.toList());
...