如何实现team.getPlayers().playing()链式调用?求Java代码方案
实现链式调用:
team.getPlayers().playing() 方案 核心思路
要实现这种链式调用,关键在于getPlayers()不能直接返回JDK原生的List<Player>(原生List没有playing()方法),而是返回一个自定义的Player集合类,在这个类中实现playing()方法来过滤可参赛的玩家。
具体实现步骤
1. 自定义Player集合类
创建一个包装List<Player>的类,比如PlayerCollection,添加playing()方法筛选符合条件的玩家:
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class PlayerCollection { private final List<Player> players; // 构造方法:传入原始玩家列表,做拷贝避免外部修改内部状态 public PlayerCollection(List<Player> players) { this.players = new ArrayList<>(players); } // 实现playing()方法:返回仍可参赛的Player列表 public List<Player> playing() { return players.stream() .filter(Player::isEligibleToPlay) // 假设Player类有判断参赛资格的方法 .collect(Collectors.toList()); } // 可选:提供获取原始列表的方法 public List<Player> getRawPlayers() { return new ArrayList<>(players); } }
2. 修改Team类的getPlayers()方法
将原来返回List<Player>的方法,改为返回自定义的PlayerCollection:
import java.util.List; public class Team { private List<Player> players; // 构造方法及其他业务逻辑省略 public PlayerCollection getPlayers() { return new PlayerCollection(players); } }
3. 链式调用示例
现在可以直接按需求调用:
Team team = new Team(); // 初始化团队玩家列表... List<Player> activePlayers = team.getPlayers().playing();
替代方案:基于Stream的简化实现
如果不想自定义集合类,也可以让getPlayers()返回Stream<Player>,通过链式过滤实现类似效果:
// 修改Team类的getPlayers() public Stream<Player> getPlayers() { return players.stream(); } // 调用时直接链式筛选 List<Player> activePlayers = team.getPlayers() .filter(Player::isEligibleToPlay) .collect(Collectors.toList());
这种方式无需自定义类,但调用格式是getPlayers().filter(...).collect(...),若要严格匹配playing()的命名,自定义集合类的方案更贴合需求。
注意事项
- 确保
Player类已实现判断参赛资格的方法(比如isEligibleToPlay()),若没有需先补充该逻辑。 - 自定义集合类中对传入列表做拷贝,避免外部修改影响内部数据的一致性。
内容的提问来源于stack exchange,提问作者Developer Team
相关产品推荐
相关产品推荐

