Question: Being new to Elixir I'm having some problems understanding pattern matching.

If I have an Elixir data structure like this:

```
list_with_maps = [%{"id" => 1, "name" => "a"}, %{"id" => 2, "name" => "b"}]

```

What would be the best way to get values of all id fields from it?

Answer: 
A more generic (and simpler) way of getting a subset of the keys of a `Map` is to use `Map.take/2`, which you can use like this:

```
map = %{"id" => 1, "name" => "a"}
Map.take(map, ["id"])
> %{"id" => 1}

```

As you can see, it takes an array of keys and returns a new map with only the keys you want.

Now, applying this to a list is as simple as using a map, and then using the `Map.take/2` in mapper function. As has been pointed out, you can do this using either a lambda:

```
Enum.map(list_with_maps, fn (map) -> Map.take(map, ["id"]) end)

```

Or you can use a capture:

```
Enum.map(list_with_maps, &(Map.take(&1, ["id"])))

```

This will create more intermediate maps, but for most situations that won't be a problem, as Elixir is pretty smart about memory re-usage and won't actually create these objects a lot of the times, unles
Another option is to use the `get_in` function and leveraging the `Access` module. The Access module lets you build expressive ways of dealing with nested data structures.

To get a list of values at `"id"` you could run:

```
get_in(list_with_maps, [Access.all, "id"])  

```

Passing `Access.all` as the first element in the list, followed by `"id"` tells `get_in` to return all `list_with_maps`'s `"id"` value.

It may seem like overkill for this example, but if your structure looked like:

```
list_with_maps = [%{"id" => 1, "identities" => [%{"name" => "a"}, %{"name" => "Secret A"}]}, %{"id" => 2, "identities" => [%{"name" => "b"},%{"name" => "Secret B"}]}]

```

We could get all of the names with:

```
get_in(list_with_maps, [Access.all, "identities", Access.all, "name"])
# [["a", "Secret A"], ["b", "Secret B"]]

```