java - 将对象数组转换为 LinkedHashMap
问题描述
我想使用 Java Stream API 创建一个 LinkedHashMap。
Map<String, String> builtProps = Maps.newLinkedHashMap();
Couple[] callLegData = getCallLegData();
for (Couple cl : callLegData) {
String key = cl.key;
String value = cl.value;
// building properties
String buildProperty = deviceInfo.buildProperty(key);
// call device info
if (buildProperty != null) {
builtProps.put(buildProperty, value);
}
}
我尝试过这样的事情
Stream.of(callLegData)
.map(k -> deviceInfo.buildProperty(k.key))
.filter(Objects::nonNull)
.collect(Collectors.toMap(key -> key, value -> value, (x, y) -> y, LinkedHashMap::new));
但未能从 callLegData 即callLegData.value获得价值。
解决方案
我建议首先过滤掉该方法buildProperty
返回 null 的对象,然后将其余部分映射到一个简单的条目并收集到映射,就像您在示例中所做的那样:
import java.util.AbstractMap.SimpleEntry;
....
Stream.of(callLegData)
.filter(cld -> deviceInfo.buildProperty(cld.key) != null)
.map(cld -> new SimpleEntry<>(deviceInfo.buildProperty(cld.key), cld.value))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));
编辑
IfbuildProperty
是一个繁重的操作,并且您不想调用该方法两次,只需交换映射和过滤操作以过滤具有空键的条目:
Stream.of(callLegData)
.map(cld -> new SimpleEntry<>(deviceInfo.buildProperty(cld.key), cld.value))
.filter(entry -> entry.getKey() != null)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));
推荐阅读
- c# - 在 asp.net core web api 中处理多个连接字符串作为参数
- javascript - 将两个处理程序合二为一并按顺序执行它们
- python - 生成和切片反向列表
- javascript - 由其他人创建的 Firebase 用户
- java - Deque 最后一个元素插入。
- sql - 如何在不截断的情况下连接列中的数字?
- python - Python Flask - 将 jsonify 响应加载为字符串
- html - CSS Grid Pre 水平滚动
- python - Pandas .at 不工作并且数据框没有改变
- python-3.x - 您可以检查 FTP 门户中压缩文件夹的内容吗?