【问题标题】:Make a method to put different methods in a single for loop respectively?制作一个方法将不同的方法分别放在一个 for 循环中?
【发布时间】:2020-02-03 15:58:07
【问题描述】:

在一个类中,我有很多算法方法,它们中的每一个都需要分别放在同一个 for 循环中。就像我每次处理算法方法时都需要编写一个 for 循环一样。 我正在尝试制作一个方法作为 for 循环,并且可以查看这些算法方法的参数。这样我就不用多次写for循环了,程序也会更小:) 但是当我尝试像通常的方式那样做时,它不起作用,因为它可能会错误地在那个方法中那些算法方法的参数。


这是常量for循环的例子

    for(int i = 0; i < 19; i++){
        for(int j = 0; j < 19; j++){
            if(Main.index[i][j] == "+ "){
               if(Main.winner == "")
                    sampleMethod();
            }   
        }
    }

这是我的for循环方法的例子

public static void AISteps(AI s){
    for(int i = 0; i < 19; i++){
        for(int j = 0; j < 19; j++){
            if(Main.index[i][j] == "+ "){
               if(Main.winner == "")
                    s();
            }   
        }
    }
}

当我运行程序时它显示

The method s() is undefined for the type AI

有没有人可以找到任何方法来达到目的?谢谢YYYY!!!

【问题讨论】:

    标签: java for-loop methods parameters


    【解决方案1】:

    您是否考虑过将lambdas 传递给您的方法并调用它们?这是一个简单的例子。

       public static void main(String[] args) {
          AISteps(() -> System.out.println("Doit!"));
          AISteps(() -> System.out.println("finished!"));
       }
    
       public static void AISteps(Runnable fnc) {
          for (int i = 0; i < 2; i++) {
             for (int j = 0; j < 2; j++) {
                /// do some processing here
                fnc.run();
             }
          }
       }
    

    阅读函数引用和 lambda 以了解您可以使用的各种选项。

    【讨论】:

    • 听起来很酷!由于我对lambda不熟悉,所以我先查一下。??
    【解决方案2】:

    Java 中的对象不能直接调用。您需要在实例上调用一个方法:

    s.aiMethod();
    

    如果要将方法作为参数传递,则需要使用方法引用。只要返回类型和参数兼容,方法引用允许您将方法转换为具有单个方法的接口。

    在这种情况下,您可以使用java.lang.Runnable 接口:

    public interface Runnable {
        public abstract void run();
    }
    

    您可以重构您的方法以轻松接受方法引用:

    public static void AISteps(Runnable method){
        for(int i = 0; i < 19; i++){
            for(int j = 0; j < 19; j++){
                if(Main.index[i][j] == "+ "){
                   if(Main.winner == "")
                        method.run();
                }   
            }
        }
    }
    

    现在您应该可以像这样为静态方法调用它了:

    AISteps(AIClass::someMethod);
    

    如果方法是实例方法,同样的规则适用:

    AIClass myAIClass = ...;
    AISteps(myAIClass::someMethod);
    

    【讨论】:

    • 哦!所以这就是它抛出错误的原因。但是,我试图不将特定方法名称放入该 for 循环方法中。我正在尝试在其中放置一些变量,以便可以在其中调用任何方法而无需重写 for 循环。原来是这个问题>﹏
    • @ZhibinChen 我更新了答案。希望这能解决您的问题
    • @ZhibinChen 请注意,这与 WJS 的答案相似。 lambdas 也被转换为单个方法接口,就像方法引用一样。
    猜你喜欢
    • 2018-04-22
    • 2017-11-30
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多