如何使用Java Stream API提取Category集合的code属性为字符串列表?
用Java 8 Stream API简化Category代码提取
没问题!Java 8的Stream API正好能帮你把这段遍历提取代码变得更简洁优雅,而且可读性和维护性都更好。先直接给你优化后的完整代码:
List<Category> categories = categoryService.getCategoriesForProductCode(productCode); List<String> categoryCodes = categories.stream() .map(Category::getCode) .collect(Collectors.toList());
代码拆解说明:
categories.stream():把你的List<Category>转换成Stream流,开启流式操作的入口.map(Category::getCode):这是方法引用的写法,等价于lambda表达式category -> category.getCode(),作用是把每个Category对象映射成它的code属性(完成类型从Category到String的转换).collect(Collectors.toList()):把流中转换后的所有String类型的code收集成一个List,替代了手动创建ArrayList并逐个add的过程
额外扩展场景:
- 指定具体的List实现:如果你需要明确生成
ArrayList而不是默认的List实现,可以用:
List<String> categoryCodes = categories.stream() .map(Category::getCode) .collect(Collectors.toCollection(ArrayList::new));
- 过滤空值:如果担心某些
Category的code为null,可以在转换后加过滤逻辑:
import java.util.Objects; List<String> categoryCodes = categories.stream() .map(Category::getCode) .filter(Objects::nonNull) .collect(Collectors.toList());
和传统写法对比:
你的传统写法大概是这样的:
List<String> categoryCodes = new ArrayList<>(); for (Category category : categories) { categoryCodes.add(category.getCode()); }
Stream写法用链式调用把「遍历-转换-收集」的逻辑一次性表达清楚,代码更紧凑,后续如果要加排序、去重等逻辑,直接在链中追加方法即可,扩展性更强。
内容的提问来源于stack exchange,提问作者Rupesh Vislawath
相关产品推荐
相关产品推荐

