Сделать метод для размещения различных методов в одном цикле for соответственно? - PullRequest
1 голос
/ 05 октября 2019

В классе у меня много алгоритмических методов, каждый из которых должен быть помещен в один и тот же цикл 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();
            }   
        }
    }

Это пример моего метода, аналогичного методу для цикла

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

Кто-нибудь может найти какой-либо способ добиться цели? СПАСИБО YYYYOU !!!

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Рассматривали ли вы передачу 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();
         }
      }
   }

Ознакомьтесь с функциональными ссылками и лямбдами, чтобы увидеть различные варианты, которые вы можете использовать.

0 голосов
/ 05 октября 2019

В 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...