如何使用Java Stream API将对象数组转换为LinkedHashMap
问题原因
你之前的Stream代码在第一步map操作就直接把Couple对象转换为了deviceInfo.buildProperty()处理后的key字符串,直接丢失了原始Couple对象中的value属性,所以后续收集阶段无法获取到对应的值。
修正方案
写法1:简洁版(适合buildProperty方法开销低的场景)
直接在过滤和收集阶段操作原始Couple对象,逻辑和原for循环完全对齐:
import java.util.Map; import java.util.LinkedHashMap; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; // 核心代码 Map<String, String> builtProps = Stream.of(getCallLegData()) .filter(cl -> Objects.nonNull(deviceInfo.buildProperty(cl.key))) .collect(Collectors.toMap( cl -> deviceInfo.buildProperty(cl.key), cl -> cl.value, // 若value为私有字段替换为对应的getter方法,比如cl.getValue() (oldVal, newVal) -> newVal, // 重复key时后者覆盖前者,和原for循环逻辑一致 LinkedHashMap::new ));
写法2:性能优化版(适合buildProperty方法计算成本高的场景)
仅调用一次buildProperty方法,避免重复计算:
import java.util.AbstractMap; import java.util.Map; import java.util.LinkedHashMap; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; // 核心代码 Map<String, String> builtProps = Stream.of(getCallLegData()) .map(cl -> new AbstractMap.SimpleEntry<>(deviceInfo.buildProperty(cl.key), cl.value)) .filter(entry -> Objects.nonNull(entry.getKey())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> newVal, LinkedHashMap::new ));
内容的提问来源于stack exchange,提问作者sushil
相关产品推荐
相关产品推荐

