如何使用Java Stream修复嵌套集合代码,从对象属性生成字符串数组
你的报错原因分析完全正确,问题出在flatMap操作后流中的元素是Operation实例,无法直接转换为String类型存入数组,同时当前代码的distinct位置也不符合业务去重需求,修复后的代码如下:
String[] operations = user.getUserTypes().stream() .map(UserType::getOperations) .flatMap(Set::stream) .map(Operation::getName) // 提取Operation的name属性,将流元素转为String类型 .distinct() // 对操作名字符串去重 .toArray(String[]::new);
改动说明
- 新增
map(Operation::getName)步骤:将每个Operation对象转换为对应的name字段值,此时流的元素类型从Operation变为String,直接解决数组类型不匹配的报错问题 - 调整
distinct()的执行顺序到提取name之后:原代码中distinct是对Operation实例去重,依赖Operation类的equals和hashCode实现,即使两个Operation的name完全相同,只要是不同对象实例就不会被去重,调整后直接对字符串格式的操作名去重,完全符合业务需求。
可选优化
如果业务要求操作名不允许为空,可以在map操作后增加filter(Objects::nonNull)过滤空值,避免最终数组中出现null元素。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

