Java中如何遍历执行方法调用列表?RobotCode机器人开发
需求实现方案
完全可以实现将Robot类的动作方法存入集合并依次执行的需求,下面提供两种实用的实现方式:
方式一:用Runnable+Lambda表达式快速封装
这种方式代码简洁,适合固定动作序列的场景:
修改你的代码,将存储动作的集合改为List<Runnable>,把每个动作封装成Lambda表达式存入集合,最后遍历集合执行即可:
import java.awt.*; import java.util.ArrayList; import java.util.List; public class NeuBot extends Robot { int rapidFire = 2; public String name; boolean firing = false; int trigger; int turnDirection = 2; final int MOVES = 5; boolean wasHit = true; int moveOne = 1; int moveTwo = 2; int moveThree = 3; // 用List<Runnable>存储每个动作 List<Runnable> actionList = new ArrayList<>(); public void run() { // 初始化动作序列,将每个操作封装为Runnable actionList.add(() -> ahead(100)); actionList.add(() -> back(200)); actionList.add(() -> turnLeft(180)); actionList.add(() -> turnRight(180)); actionList.add(() -> onScannedRobot(null)); actionList.add(() -> onHitRobot(null)); while (true) { // 依次执行集合中的所有动作 for (Runnable action : actionList) { action.run(); } } } // 原有方法保持不变 public void onScannedRobot(ScannedRobotEvent e) { for (int i = 0; i < MOVES; ++i) { firing = true; fire(rapidFire); if (firing == true) { back(50); out.println("Moved Back"); //TestX } } turnRight(10); ahead(20); } public void onHitRobot(HitRobotEvent e) { out.println("Hit"); wasHit = true; if (wasHit == true) { ahead(20); fire(rapidFire); out.print("Fired Again!"); } } }
方式二:自定义动作类(更灵活扩展)
如果需要动态调整动作参数、扩展动作类型,建议用自定义类来封装动作信息:
import java.awt.*; import java.util.ArrayList; import java.util.List; public class NeuBot extends Robot { int rapidFire = 2; public String name; boolean firing = false; int trigger; int turnDirection = 2; final int MOVES = 5; boolean wasHit = true; int moveOne = 1; int moveTwo = 2; int moveThree = 3; // 自定义动作类,记录动作类型和参数 static class RobotAction { enum ActionType { AHEAD, BACK, TURN_LEFT, TURN_RIGHT, SCANNED_ROBOT, HIT_ROBOT } ActionType type; int param; // 带参数的动作构造方法 public RobotAction(ActionType type, int param) { this.type = type; this.param = param; } // 无参数的动作构造方法 public RobotAction(ActionType type) { this.type = type; this.param = 0; } } // 存储自定义动作的集合 List<RobotAction> actionList = new ArrayList<>(); public void run() { // 初始化动作序列 actionList.add(new RobotAction(RobotAction.ActionType.AHEAD, 100)); actionList.add(new RobotAction(RobotAction.ActionType.BACK, 200)); actionList.add(new RobotAction(RobotAction.ActionType.TURN_LEFT, 180)); actionList.add(new RobotAction(RobotAction.ActionType.TURN_RIGHT, 180)); actionList.add(new RobotAction(RobotAction.ActionType.SCANNED_ROBOT)); actionList.add(new RobotAction(RobotAction.ActionType.HIT_ROBOT)); while (true) { // 遍历执行每个动作 for (RobotAction action : actionList) { switch (action.type) { case AHEAD: ahead(action.param); break; case BACK: back(action.param); break; case TURN_LEFT: turnLeft(action.param); break; case TURN_RIGHT: turnRight(action.param); break; case SCANNED_ROBOT: onScannedRobot(null); break; case HIT_ROBOT: onHitRobot(null); break; } } } } // 原有方法保持不变 public void onScannedRobot(ScannedRobotEvent e) { for (int i = 0; i < MOVES; ++i) { firing = true; fire(rapidFire); if (firing == true) { back(50); out.println("Moved Back"); //TestX } } turnRight(10); ahead(20); } public void onHitRobot(HitRobotEvent e) { out.println("Hit"); wasHit = true; if (wasHit == true) { ahead(20); fire(rapidFire); out.print("Fired Again!"); } } }
两种方式都能实现你的需求:第一种代码更简洁,适合快速实现固定动作;第二种扩展性更强,后续可以轻松添加新动作类型或动态修改动作参数。
内容的提问来源于stack exchange,提问作者smouvfox805
相关产品推荐
相关产品推荐

