如何在列表中存储对象(指令)并调用它?

时间:2014-10-19 10:37:10

标签: java methods invoke

假设我想在列表中添加对象(指令)并从该列表中按顺序调用? 例如

public static void main(String [] args){

    List list = new ArrayList();
    list.add(System.out.println("1"))
    list.add(System.out.println("2"))
    list.add(System.out.println("3"))

    try{
        for(Object i : list){
        i.invoke()   //....like this i want to invoke each syso
       }
    catch(Exception e){
       e.printStackTrace();
       }
    }

}

2 个答案:

答案 0 :(得分:3)

您无法在列表中存储“说明”。所有你可以存储的是对象。但是对象有方法,你可以调用这些方法:

List<Runnable> list = new ArrayList<>();
list.add(() -> System.out.println("1"));
list.add(() -> System.out.println("2"));
list.add(() -> System.out.println("3"));

for (Runnable r : list) {
    r.run();
}

以上是使用自Java 8以来可用的lambdas。但您可以在以前的版本中使用匿名类:

List<Runnable> list = new ArrayList<>();
list.add(new Runnable() {
    @Override
    public void run() { 
        System.out.println("1");
    }
});
list.add(new Runnable() {
    @Override
    public void run() { 
        System.out.println("2");
    }
});
list.add(new Runnable() {
    @Override
    public void run() { 
        System.out.println("3");
    }
});   

for (Runnable r : list) {
    r.run();
}

或者您可以定义自己的打印机类:

public class Printer {
    private final String toPrint;

    public Printer(String toPrint) {
        this.toPrint = toPrint;
    }

    public void print() {
        System.out.println(toPrint);
    }
}


List<Printer> list = new ArrayList<>();
list.add(new Printer("1"));
list.add(new Printer("2"));
list.add(new Printer("3"));

for (Printer p : list) {
    p.print();
}

答案 1 :(得分:0)

您可以使用Interface,然后为您的步骤提供具体方法:

public interface Action {

    void doStuff();

}

调用类

public static void main(String[] args) {
        List<Action> list = new ArrayList<Action>();
        list.add(new Action() {

            @Override
            public void doStuff() {
                //Custom code for the step
            }
        });
        //Invoke

        for(Action action : list) {
            action.doStuff();
        }
    }