Java嵌套循环转Stream遇编译错误,如何用flatMap实现?
错误原因分析
forEach是Stream的终端操作,它的返回值是void,你试图把void类型的值赋值给List<Player>类型的players变量,这本身就不符合语法规则。- 编译器报错“variable 'players' might not have been initialized”,是因为你在赋值语句的右侧lambda里引用了
players,但此时players还未完成初始化(赋值语句还没执行结束);同时lambda内部修改局部变量的操作,也违反了Java对lambda捕获变量的要求(局部变量必须是final或等效final)。
正确的Stream写法(使用flatMap)
如果需要指定集合类型为ArrayList:
import java.util.stream.Collectors; List<Player> players = teams.stream() // 将每个Team对应的TeamPlayers列表转为Stream,合并成一个全局Stream .flatMap(team -> team.getTeamPlayers().stream()) // 将每个TeamPlayer转换为Player对象 .map(teamPlayer -> new Player(teamPlayer.getName(), teamPlayer.getPosition())) // 收集为ArrayList .collect(Collectors.toCollection(ArrayList::new));
如果不需要指定具体集合类型,可简化为:
import java.util.stream.Collectors; List<Player> players = teams.stream() .flatMap(team -> team.getTeamPlayers().stream()) .map(p -> new Player(p.getName(), p.getPosition())) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者mariohez
相关产品推荐
相关产品推荐

