如何用Lambda将List<SomeClass>转换为Map<SomeClass::getField1, Set<SomeClass::getField2>>?
用Lambda实现List转Map<String, Set>
直接借助Java Stream的Collectors.groupingBy结合下游收集器就能完成需求,核心逻辑是按field1分组,同时将每组对应的field2值收集到Set中:
// 假设已有List<SomeClass>实例 List<SomeClass> someClassList = new ArrayList<>(); // 转换代码 Map<String, Set<String>> field1ToField2SetMap = someClassList.stream() .collect(Collectors.groupingBy( SomeClass::getField1, // 分组依据:取field1的值作为Map的key Collectors.mapping( // 将每个SomeClass对象转换为对应的field2值 SomeClass::getField2, Collectors.toSet() // 把转换后的field2值收集成Set作为Map的value ) ));
额外说明
- 要是需要保留
field2的插入顺序,可以把Collectors.toSet()替换为Collectors.toCollection(LinkedHashSet::new),这样得到的Set会维持元素添加的先后顺序。 - 如果原列表为空,转换后的Map也会是空集合,无需额外处理空指针场景。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

