使用Java8从特定键值的Map列表中创建arraylist

ecr0jaav  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(399)

我有一个带有Map列表的对象。每张Map如下所示:

{
  id: "something",
  link: "someLink"
}

我正在尝试创建一个包含Map中所有id的数组列表。我可以用一个简单的循环

List<String> Ids = new ArrayList<>();

 List<Map<String, String>> maps = pojo.getMaps();

 for(Map<String, String> map: maps) {
       Ids.add(map.get("id"));
    }

但是如何使用Java8流在一行中实现这一点呢?我从来没有用过Map,所以我迷路了。我想应该是这样的,但我真的不知道

List<String> ids = pojo.getMaps().stream().map(Map.Entry::  ???? ).collect(Collectors.toList())
vojdkbi0

vojdkbi01#

pojo.getMaps().stream() 到目前为止,还不错。你现在有一股 Map<String, String> 物体。我们只需要从这里拿到钥匙。那么,给你一个奇怪的Map的东西,我们怎么把它变成关键值呢?
看起来像是一件小事 map.get("id") 做那工作,不是吗?
让我们把它放在lambda中: pojo.getMaps().stream().map(theMap -> theMap.get("id")) 现在我们有一个 Stream<String> 有身份证。

不过,大注!

事实上,从一个看起来像对象的map对象开始就是一个巨大的代码气味。最有可能的情况是,您应该回到项目中的几个步骤,并解决这个问题。您真的应该有一个类来表示这个链接概念:

@Value
public class Link {
    String id, link;
}

从那里开始:

listOfLinks.stream().map(Link::getId).distinct().collect(...);

注:以上是Lombok山的 @Value .

功能只是一种工具

注意,不需要重写代码来“使用Java8特性”。比较:

var ids = pojo.getMaps().stream()
      .map(m -> m.get("id"))
      .collect(Collectors.toList());

使用:

var ids = new ArrayList<String>();
    for (var m : pojo.getMaps()) ids.add(m.get("id"));

代码量差不多。

bpsygsoo

bpsygsoo2#

您可以使用 id 在循环中以同样的方式从Map开始。在这里 .map() 用于转换 Map<String, String>String 表示将Map转换为键的值 id ```
List ids = pojo.getMaps().stream() // Stream<Map<String, String>>
.map(e -> e.get("id")) // Stream
.collect(Collectors.toList());

相关问题