Конвертировать список> в список <Long>Java 8 - PullRequest
0 голосов
/ 09 марта 2019

У меня есть список карт, в котором каждая из карт имеет только one key-value pair каждая.Мне нужно преобразовать это просто в список ключей.Я пытаюсь использовать потоки следующим образом:

List<Map<Long, String>> lst = // some data
List<Long> successList = lst.stream().map(ele -> ele.keySet().toArray()[0]).collect(Collectors.toList());

Но в итоге я получаю следующую ошибку:

java: incompatible types: inference variable T has incompatible bounds
  equality constraints: java.lang.Long
  lower bounds: java.lang.Object

Как мне решить эту проблему или есть какой-то лучший подход?

Ответы [ 4 ]

5 голосов
/ 09 марта 2019

Используйте Steram#flatMap, как показано ниже:

lst.stream()
   .flatMap(e->e.entrySet().stream())
   .map(e->e.getKey())
   .collect(Collectors.toList());

Редактировать: (согласно комментарию) Более элегантным способом будет использование Map#keySet вместо Map#entrySet.

lst.stream()
   .flatMap(e -> e.keySet().stream())
   .collect(Collectors.toList());
5 голосов
/ 09 марта 2019

Вам нужно просто:

List<Long> successList = lst.stream()
        .flatMap(e -> e.keySet().stream())
        .collect(Collectors.toList());
3 голосов
/ 09 марта 2019

Хотя лучшие ответы уже были опубликованы (flatMap - ваш друг здесь), я думаю, что здесь стоит указать, что ошибка ввода связана с использованием toArray без аргумента.

jshell> List<Long> a = Arrays.asList(1L, 2L, 3L, 4L)
a ==> [1, 2, 3, 4]

jshell> a.toArray()
$2 ==> Object[4] { 1, 2, 3, 4 }

Видишь? Когда вы используете toArray без аргумента, вы получаете результат типа Object[]. Так что сделайте это вместо:

jshell> a.toArray(new Long[1])
$3 ==> Long[4] { 1, 2, 3, 4 }

Добавляя аргумент new Long[1], мы заставляем результат toArray быть массивом Long, который вы хотите, вместо массива объектов.

См. JavaDoc для `toArray '

1 голос
/ 09 марта 2019

Используйте это:

lst.stream().flatMap(m -> m.entrySet().stream()).map(Map.Entry::getKey).collect(toList());
...