如何用Lambda与Stream将Group列表转为Entity键映射Group值的单行代码
用Stream改写后的单行实现
如果要保持和原代码完全一致的行为(重复Entity key时,后出现的会覆盖之前的),可以这么写:
Map<String, String> entityGroup = groups.stream() .flatMap(group -> group.getEntities().stream().map(entity -> new AbstractMap.SimpleEntry<>(entity.getKey(), group.getKey()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (existing, replacement) -> replacement));
代码说明
- 先把
groups转为Stream,通过stream()方法开启流式操作 - 用
flatMap将每个Group下的Entity列表“展开”成单个Entity的流,同时把每个Entity的key和所属Group的key包装成SimpleEntry键值对 - 最后通过
Collectors.toMap收集成目标Map:- 第一个参数指定用Entry的key作为Map的键(也就是Entity的key)
- 第二个参数指定用Entry的value作为Map的值(也就是Group的key)
- 第三个参数是重复键的处理逻辑,
(existing, replacement) -> replacement表示新值覆盖旧值,和原代码中put方法的行为完全一致
如果确定不会出现重复的Entity key,也可以省略第三个参数,简化成:
Map<String, String> entityGroup = groups.stream() .flatMap(g -> g.getEntities().stream().map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), g.getKey()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
内容的提问来源于stack exchange,提问作者Mortova
相关产品推荐
相关产品推荐

