Java函数式编程:从棋子列表提取白骑士的BoardField列表
获取棋盘上所有白骑士的位置列表
直接给你补全代码,同时加一些实用的细节说明:
import java.util.List; import java.util.stream.Collectors; // 补全后的完整流操作 List<BoardField> whiteKnightPositions = chessmen.stream() .filter(chessman -> chessman.getSide().equals(Side.White)) .filter(chessman -> chessman.getClass().equals(Knight.class)) .map(Chessman::getBoardField) // 提取棋子对应的位置字段 .collect(Collectors.toList()); // 收集为BoardField列表
关键步骤解释
map(Chessman::getBoardField):这一步把筛选后的Chessman对象,直接转换为它持有的BoardField实例——也就是我们最终要的位置信息。这里用了方法引用写法,比匿名lambda表达式chessman -> chessman.getBoardField()更简洁易读。collect(Collectors.toList()):把流中的BoardField元素收集成普通的可变列表。如果你的项目使用Java 16及以上版本,也可以用Collectors.toUnmodifiableList()得到一个不可变列表,避免后续意外修改,根据业务需求选择即可。
额外优化建议
关于判断棋子类型的逻辑,如果你后续可能会有Knight的子类(比如MagicalKnight),用instanceof会比直接比较getClass()更灵活:
// 替换第二个filter,兼容Knight的子类场景 .filter(chessman -> chessman instanceof Knight)
这种写法会保留所有继承自Knight的棋子实例,而getClass().equals(Knight.class)只会匹配Knight本身的对象。如果你的场景里不会有子类,两种写法都可以。
内容的提问来源于stack exchange,提问作者Krzysztof
相关产品推荐
相关产品推荐

