首页 > 解决方案 > Java 8 Streams:迭代地图内的列表

问题描述

我在迭代嵌入在另一个地图中的对象内的列表时遇到问题。我的目标是遍历这个列表并生成一个 map<String,String>,我想使用流和 lamdas 来实现这一点。

public class ModelBO {
    private String id;
    private String name;
    private String version;
    private Map<String, FolderBO> folderValues = null; 
}

public class FolderBO {
    private String id;
    private String name;
    private String type;
    private Map<String, String> properties;
    private List<ElementBO> elements = new ArrayList<ElementBO>();
}

public class ElementBO {
    private String id;
    private String name;
    private String type;
}

我在上面看到我需要通过迭代文件夹Bo 内的elementList 来从elementBo 创建一个带有map<id,name> 的地图。folderBo 本身位于 ModelBo 的地图中。

我已经编写了以下代码。

  Map<String,String> elementMap = 
    UniModelBO.getInstance().getFolderValues().entrySet().stream()
       .filter(entrySet -> entrySet.getKey()!="relations")
       .map(entrySet -> entrySet.getValue().getElements()::stream)
       .collect(Collectors.toMap(ElementBO::getName, ElementBO::getId));

UniModelBO 是为 ModelBo 创建单例对象的实用程序类。

标签: java-streamiteration

解决方案


您快到了,只需使用flatMap将嵌套List流转换为单个流。我也会推荐使用equals字符串比较的方法:

Map<String, String> elementMap =
        UniModelBO.getInstance().getFolderValues().entrySet().stream()
                .filter(entrySet -> !entrySet.getKey().equals("relations"))
                .flatMap(entrySet -> entrySet.getValue().getElements().stream())
                .collect(Collectors.toMap(ElementBO::getName, ElementBO::getId));
                           

推荐阅读