将 List<Map<Long, String>> 转换为 List<Long> Java 8

我有一个地图列表,其中每个地图只有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

我该如何解决这个问题,或者有没有更好的方法?


拉莫斯之舞
浏览 439回答 4
4回答

侃侃无极

使用Stream#flatMap如下:lst.stream() &nbsp;&nbsp;&nbsp;.flatMap(e->e.entrySet().stream()) &nbsp;&nbsp;&nbsp;.map(e->e.getKey()) &nbsp;&nbsp;&nbsp;.collect(Collectors.toList());编辑:(&nbsp;根据评论)更优雅的方式将是使用 ofMap#keySet而不是&nbsp;Map#entrySet.lst.stream() &nbsp;&nbsp;&nbsp;.flatMap(e&nbsp;->&nbsp;e.keySet().stream()) &nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

米脂

你只需要:List<Long>&nbsp;successList&nbsp;=&nbsp;lst.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.flatMap(e&nbsp;->&nbsp;e.keySet().stream()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

Smart猫小萌

虽然已经发布了更好的答案(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不带参数使用时,你会得到 type 的结果Object[]。所以改为这样做:jshell> a.toArray(new Long[1])$3 ==> Long[4] { 1, 2, 3, 4 }通过添加参数new Long[1],我们强制结果为toArray您想要的 Long 数组,而不是对象数组。参见JavaDoc 中的“toArray”

当年话下

用这个:lst.stream().flatMap(m&nbsp;->&nbsp;m.entrySet().stream()).map(Map.Entry::getKey).collect(toList());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java