Как передать аргумент в Method_reference в Java 8 для пользовательского интерфейса и метода - PullRequest
2 голосов
/ 11 октября 2019

Мой код выглядит примерно так:

@FunctionalInterface
interface MathOperation2 {
    int operation2(int a, int b, int c);
 }

public class Method_reference_demo {
    private static int operate2(int a, int b, int c, MathOperation2 obj) 
    { 
        return obj.operation2(a, b, c);
    }
    private void Method_reference_demo01() 
    {       
    MathOperation2 mo2 = Method_reference_demo::operate2;
    mo2.operation2(2,3,4);
    }
}

в любом случае, я могу заставить его работать, передавая параметр через две последние строки. означает ниже линии. MathOperation2 mo2 = Method_reference_demo::operate2; mo2.operation2(2,3,4); Я хочу использовать приведенный выше фрагмент в качестве рабочего кода.
ПРИМЕЧАНИЕ. Я не могу изменить ни одну строку кода, кроме этих двух строк, и хочу использовать ссылку на метод Java 8.

Ответы [ 2 ]

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

Вы можете сделать что-то вроде

@FunctionalInterface
interface MathOperation2 {
    int operation2(int a, int b, int c);
}

public class Method_reference_demo {
    private static int operate2(int a, int b, int c) {
        return a+b+c;
    }

    private static void Method_reference_demo01() {
        MathOperation2 mo2 = Method_reference_demo::operate2;
        System.out.println(mo2.operation2(2, 3, 4));
    }

    public static void main(String[] args) {
        Method_reference_demo01();
    }
}

Но это не соответствует вашим требованиям на 100%, как вы упомянули:

Я не могу изменить ни одну строку кода, кромеэти две строки

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

Итог: - Вы должны предоставить реализацию интерфейса в определенный момент времени, чтобы использовать его.


Строкакода

MathOperation2 mo2 = Method_reference_demo::operate2

в недопустимом объявлении, поскольку подпись метода operate2

int operate2(int a, int b, int c, MathOperation2 obj)

предполагает, что MathOperation2 также будет передан методу.

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


Я не могу изменить ни одну строку кода, кроме этих двух строк

Затем вы можете определить свой интерфейс следующим образом:

MathOperation2 mo2 = (a, b, c) -> {
    return 0; // perform the operation with a, b and c here
};
System.out.println(mo2.operation2(2, 3, 4)); // just to print the output

например, чтобы добавить три целых числа, представление будет выглядеть следующим образом:

MathOperation2 mo2 = (a, b, c) -> a + b + c;
System.out.println(mo2.operation2(2, 3, 4)); // would print '9'

(из комментариев). С точки зрения ссылок на метод, пример будет выглядеть следующим образом:

private static int operate2(int a, int b, int c) { // <<-- notice the method signature
    return a + b + c; // <<--  and a definition
}

private void Method_reference_demo01() {
    MathOperation2 mo2 = Method_reference_demo::operate2;
    System.out.println(mo2.operation2(2, 3, 4)); // prints '9'
}
...