java - 如何使用 lambdas 和流避免此映射的嵌套循环
问题描述
我想改进这个算法,避免生成嵌套循环,可能会利用流和 java 8 函数。对于每个键,我想创建一个对象(TreeView,一个 JavaFx 的对象),并为键相关的 foreach 值为树对象创建一个新的“儿子”。
Map<MyEnum, List<myObject>> myMap = new HashMap<>();
List<TreeItem<String>> product = new ArrayList<>();
myMap.forEach((k,v) -> {
TreeItem<String> fatherItem = new TreeItem<String> (k.getName());
myMap.get(k).forEach(e -> {
fatherItem.getChildren().add(new TreeItem<String> (e.getName());
});
product.add(fatherItem);
});
我真的很好奇如何改进它。提前感谢您的回答!
解决方案
我建议您创建一种新方法来将键和列表转换为树项 - 这将使您的代码比在 lambda 块中更清晰:
private TreeItem<String> makeTree(MyEnum root, List<MyClass> items) {
TreeItem<String> tree = new TreeItem<>(root.getName());
items.stream().map(MyClass::getName).map(TreeItem::new).forEach(tree::add);
return tree;
}
这可以在单个收集器中完成,但实际上,我认为它不会使您的代码更清晰。
然后将您的地图转换为树木列表变为:
List<TreeMap<String>> trees = map.entrySet().stream()
.map(e -> makeTree(e.getKey(), e.getValue()))
.collect(Collectors.toList());
推荐阅读
- python - Python:使用 SQL 从表中检索列作为字典
- openstreetmap - 如何在开放的街道地图上添加标记而不提及经纬度
- reactjs - 使用 React 钩子在 React js 中预览上传的图像
- unity3d - 限制相机在 X 轴上的旋转角度
- python - Python Dataframe 简单平均错误:TypeError: Expected tuple, got str
- windows - 如何计算 git 中未暂存的文件?
- adapter - 如何使用 discord.py 指定我的不和谐机器人应该使用什么适配器
- spring - Spring Data 和双向关系的持久性上下文问题
- matching - 将 3D 点云与 CAD 模型实时匹配
- javascript - 在 HTML 中使用加速元素