【问题标题】:Java 8 Streams: Iterate Over a List Inside a MapJava 8 Streams:迭代地图内的列表
【发布时间】:2020-11-24 10:55:00
【问题描述】:

我在迭代嵌入在另一个地图中的对象内的列表时遇到问题。 我的目标是遍历这个列表并生成一个 map,我想使用流和 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 的地图。 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 创建单例对象的实用程序类。

【问题讨论】:

  • 什么是UniModelBO.getInstance().getFolderValues()
  • 提供一组示例数据和预期结果会很有帮助。另外,为什么不尝试使用传统循环来实现您的目标呢?如果有必要,翻译成流要容易得多。
  • 它是一个创建 ModelBo 的实用单例类

标签: java-stream iteration


【解决方案1】:

你快到了,只需使用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));
                           

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多