将List <map <long,string =“” >>转换为List <long> Java 8

时间:2019-03-09 20:11:35

标签: java java-8 java-stream collect

我有一个地图列表,其中每个地图只有editMessageText个。我需要将其转换为仅键列表。我正在尝试使用流,如下所示:

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());

我该如何解决此问题,或者有什么更好的方法?

4 个答案:

答案 0 :(得分:5)

使用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());

答案 1 :(得分:5)

您只需要:

List<Long> successList = lst.stream()
        .flatMap(e -> e.keySet().stream())
        .collect(Collectors.toList());

答案 2 :(得分:3)

尽管已经发布了更好的答案(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的结果是所需的Longs数组,而不是对象数组。

请参见JavaDoc for `toArray'

答案 3 :(得分:1)

使用此:

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