Java中如何将List<Set<String>>转换为List<List<String>>
Java List<Set> 转 List<List> 实现方案
Java 8+ Stream 常用写法
这种写法是日常开发中最常用的方案,代码简洁可读性高:
import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; // 核心转换逻辑 List<Set<String>> source = ...; // 你的原始List<Set<String>>数据 List<List<String>> target = source.stream() .map(ArrayList::new) .collect(Collectors.toList());
如果不需要修改转换后的子List,可以用不可变收集器优化(Java 10+支持):
List<List<String>> target = source.stream() .map(ArrayList::new) .collect(Collectors.toUnmodifiableList());
Java 16+ 极简写法
JDK 16之后Stream新增了直接转List的方法,配合List.copyOf可以写出更短的代码:
List<List<String>> target = source.stream() .map(List::copyOf) .toList();
注意:该方式返回的子List和外层List都是不可变的,尝试修改会抛出UnsupportedOperationException
兼容低版本的循环写法
如果需要兼容Java 7及更早版本,可以用普通遍历实现:
List<List<String>> target = new ArrayList<>(); for (Set<String> item : source) { target.add(new ArrayList<>(item)); }
注意事项
- 子List的元素顺序和原Set的遍历顺序一致,如果你需要固定顺序,原始Set需要用
LinkedHashSet实现,HashSet本身不保证遍历顺序 - 如果有去重需求可以保留Set的特性,转换为List之后不会自动去重,新增元素不会触发去重校验
- 不可变List的实现性能比普通
ArrayList更高,不需要修改结果的场景优先使用不可变实现
内容的提问来源于stack exchange,提问作者Himanshu Sharma
相关产品推荐
相关产品推荐

