Snow
Snow

Reputation: 71

Stream over a List of Map and collect specific key

This is my List:

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

I want to pluck name values and create another List like this:

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

I've written this code and it works:

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

But how to do it in using stream. I've tried this code which doesn't work.

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

Upvotes: 7

Views: 4730

Answers (3)

Alex
Alex

Reputation: 2030

If list from your iterator has type of Map<String, Object> then I think that the best way to do that task is just invoke method keySet() which will return Set but you can create ArrayList from it in the following way:

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

Upvotes: 1

wanda
wanda

Reputation: 21

x.get("name") should be cast to String.

for example:

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

Upvotes: 2

Eran
Eran

Reputation: 393801

Since your List appears to be a List<Map<String,Object>, your stream pipeline would produce a List<Object>:

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

Or you could cast the value to String if you are sure you are going to get only Strings:

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

Upvotes: 10

Related Questions