如何使用另一个列表中的Map属性创建一个新列表

Ris*_*ari 2 java dictionary list java-8 java-stream

想象一下,我有一个List<Map<String,Object>>:

[{'id':1,'name':'xyz'},{'id':2,'name':'abc'},{'id':3,'name':'pqr'}]
Run Code Online (Sandbox Code Playgroud)

我需要生成另一个列表,包括上面列表中的名称:

List<String>
Run Code Online (Sandbox Code Playgroud)

避免使用循环,是否可以通过使用java stream api来实现这一点?

And*_*lko 7

List<String> names = list.stream()
                         .map(i -> i.get("name").toString())
                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

由于i.get("name").toString()可能会产生NPE,因此过滤掉不包含密钥的地图是明智的"name":

List<String> names = list.stream()
                         .filter(i -> i.containsKey("name"))
                         .map(i -> i.get("name").toString())
                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

要么

List<String> names = list.stream()
                         .map(i -> i.get("name"))
                         .filter(Objects::nonNull)
                         .map(Object::toString)
                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`i.getOrDefault(i,"other")` (2认同)
  • 也许`map(i - > i.get("name")).filter(name - > name!= null).map(name - > name.toString())`以防止`containsKey`? (2认同)