如何用Java 8 Stream API基于ArrayList过滤Map并设置到Person实例
基于可见属性列表过滤Map并设置到Person实例的解决方案
你给出的流式处理思路已经很到位了!不过咱们可以再优化下性能,同时提供几种不同风格的实现方式供你选择。
优化后的流式实现
首先建议把personVisibleAttributes转换成HashSet——因为ArrayList.contains()是遍历整个列表的O(n)操作,而HashSet的查询是O(1)的常数时间,当你的属性列表比较长时,性能提升会很明显:
// 转换为HashSet提升键查询效率 Set<String> visibleKeySet = new HashSet<>(personVisibleAttributes); // 过滤并设置到Person实例 personAllNature.entrySet().stream() .filter(entry -> visibleKeySet.contains(entry.getKey())) .forEach(entry -> p.setBehaviour(entry.getKey(), entry.getValue()));
这里我用了普通的stream()而非parallelStream()——并行流适合处理超大规模的数据,小数据量下反而会有线程调度的额外开销,日常场景用普通流就足够啦。
传统循环实现(可选)
如果你更习惯非流式的写法,传统的增强for循环也能轻松实现需求:
Set<String> visibleKeySet = new HashSet<>(personVisibleAttributes); for (Map.Entry<String, String> entry : personAllNature.entrySet()) { if (visibleKeySet.contains(entry.getKey())) { p.setBehaviour(entry.getKey(), entry.getValue()); } }
进阶优化:批量设置方法
如果后续需要频繁做这类批量设置的操作,可以给Person类新增一个批量设置的方法,让代码更简洁:
// 在Person类中新增批量设置方法 public void setBehaviours(Map<String, String> behaviours) { personNature.putAll(behaviours); }
之后就可以把过滤后的结果直接收集成Map,再一次性设置:
Set<String> visibleKeySet = new HashSet<>(personVisibleAttributes); Map<String, String> filteredBehaviours = personAllNature.entrySet().stream() .filter(entry -> visibleKeySet.contains(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); p.setBehaviours(filteredBehaviours);
内容的提问来源于stack exchange,提问作者Abhik Das
相关产品推荐
相关产品推荐

