为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2022-07-27 20:19:08
我有一个地图列表,其中每个地图只有one key-value pair一个。我需要将其转换为键列表。我正在尝试按如下方式使用流:List<Map<Long, String>> lst = // some dataList<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 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

使用Stream#flatMap如下:

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

编辑:( 根据评论)更优雅的方式将是使用 ofMap#keySet而不是 Map#entrySet.

lst.stream()
   .flatMap(e -> e.keySet().stream())
   .collect(Collectors.toList());


查看完整回答
反对 回复 2022-07-27
?
米脂

TA贡献1836条经验 获得超3个赞

你只需要:

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


查看完整回答
反对 回复 2022-07-27
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

虽然已经发布了更好的答案(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”


查看完整回答
反对 回复 2022-07-27
?
当年话下

TA贡献1890条经验 获得超9个赞

用这个:

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


查看完整回答
反对 回复 2022-07-27
  • 4 回答
  • 0 关注
  • 426 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信