流式传输地图列表并收集特定密钥

时间:2017-06-06 09:20:26

标签: java java-8 java-stream

这是我的清单:

[
    {name: 'moe', age: 40}, 
    {name: 'larry', age: 50}, 
    {name: 'curly', age: 60}
];

我想要获取name个值并创建另一个List,如下所示:

["moe", "larry", "curly"]

我编写了这段代码并且有效:

List<String> newList = new ArrayList<>();
for(Map<String, Object> entry : list) {
    newList.add((String) entry.get("name"));
}

但是如何在使用stream时这样做。我已经尝试过这个不起作用的代码。

List<String> newList = list.stream().map(x -> x.get("name")).collect(Collectors.toList());

3 个答案:

答案 0 :(得分:8)

由于您的List似乎是List<Map<String,Object>,您的流管道会生成List<Object>

List<Object> newList = list.stream().map(x -> x.get("name")).collect(Collectors.toList());

如果您确定只获得String s,则可以将值转换为String

List<String> newList = list.stream().map(x -> (String)x.get("name")).collect(Collectors.toList());

答案 1 :(得分:2)

x.get(&#34; name&#34;)应该转换为String。

例如:

List<String> newList = list.stream().map(x -> (String) x.get("name")).collect(Collectors.toList());

答案 2 :(得分:1)

如果你的迭代器中的list类型为Map<String, Object>,那么我认为执行该任务的最佳方法是调用方法keySet(),它将返回Set但是你可以通过以下方式从中创建ArrayList

List<String> result = new ArrayList(list.keySet());