java-stream - 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 创建单例对象的实用程序类。
解决方案
您快到了,只需使用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));
推荐阅读
- ios - 通知 iOS 用户必须打开蓝牙
- ios - 重新调整布局大小后,如何将渐变层的大小放置在 UITextField 后面,与 UITextField 大小匹配?
- python - 3个数组的n行n列数的标准差
- list - 从 Maxima CAS 中的函数值列表中查找函数的根
- angular - Angular 在取消订阅时不会取消包装的 HTTP 请求
- android-studio - LibGdx 如何仅在演员之间重叠开始时播放声音?
- java - 无法导入 ClassPathXmlApplicationContext
- python-3.x - 包含“ - ”的字符串总是用 ruamel.yaml 换行
- c# - 直接阅读帖子正文
- android - 如何在字符串上设置颜色