我有一个地图列表,其中每个地图只有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());
我该如何解决此问题,或者有什么更好的方法?
答案 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数组,而不是对象数组。
答案 3 :(得分:1)
使用此:
lst.stream().flatMap(m -> m.entrySet().stream()).map(Map.Entry::getKey).collect(toList());