java-stream - Java 8 流 : Iterate Over a List Inside a Map

标签 java-stream iteration

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

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;
}

我在上面看到我需要通过迭代folderBo内的elementList来从elementBo创建一个带有map的 map 。 folderBo 本身位于 ModelBo 的 map 内。

我编写了以下代码。

  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 创建单例对象的实用程序类。

最佳答案

您已经差不多完成了,只需使用 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));
                           

关于java-stream - Java 8 流 : Iterate Over a List Inside a Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64984974/

相关文章:

java - 用 Java 中的流 API 调用替换 for-each 循环

boost - 迭代多级 boost 树

arrays - 在 Rust 中循环遍历整数字节的惯用方法是什么?

python-3.x - 如何修复迭代 pandas 分组 df 时的 ValueError?

python - 使用 join 时,Spark 迭代时间呈指数增长

java - 如何在 HashMap 中添加多个具有相同键的相同类型的对象

java - 多个可选实例的逻辑或?

java - 对对象列表进行分组以创建扩展对象列表

java - 使用流将 2d int 数组格式化为字符串

java - 为什么 Files.list() 并行流的执行速度比使用 Collection.parallelStream() 慢得多?