2017-06-06 77 views
6

这是我的清单:流过地图的列表,并收集特定键

[ 
    {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()); 
+0

仅供参考,这些都不是JSON。我刚刚用它们来表示我的'List'对象。 – Snow

回答

7

由于您的List似乎是一个List<Map<String,Object>,你流的管道会产生List<Object>

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

或者,如果你确信你会得到只有String你可以施放价值String s:

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

这看起来像'json',并且有方法可以将它转换为'String'而不是那个'Object' ...我也会建议 – Eugene

2

x.get(“name”)应该转换为String。

例如:

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

1

如果list从迭代器的Map<String, Object>类型,那么我认为,这样做任务的最佳方法就是调用方法keySet()将返回Set,但你可以创建ArrayList从它以下列方式:

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