Лямбда-выражение понимания - PullRequest
0 голосов
/ 19 января 2020

Может ли кто-нибудь объяснить мне, каков будет вывод этого кода и почему?

Я действительно не понимаю, как именно работают лямбды.

interface IntProcessor {
    int process(int i1, int i2);
}

public static void main(String[] args) {
    IntProcessor ip1 = (x,y) -> x*2 + y;
    IntProcessor ip2 = (a,b) -> a + b*2;
    int x = 3;
    int y = 7;
    x = ip1.process(x,y);
    y = ip2.process(y,x);
    System.out.println(x + ", " + y);
}   

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 20 января 2020

Лямбды - это способ предоставления реализации интерфейса, который имеет только один абстрактный метод (известный как functional interface).

С учетом следующего объявления интерфейса

interface IntProcessor {
    int process(int input1, int input2);
}

До Java 8. Было два способа использовать его. Один из них заключался в том, чтобы определить класс и реализовать его.

    class MyIntProcessor implements IntProcessor {
        public int process(int a, int b) {
            return  a*a + b*b;
        }
    }

Затем вы могли бы сделать это.

        IntProcessor ip1 = new MyIntProcessor();
        int n = ip1.process(4,5);
        System.out.println(n); // prints 41

Другим способом было создание анонимного класса

        IntProcessor ip2 = new IntProcessor() {
            public int process(int a, int b) {
               return a*a + b*b;
            }
        };

И снова.

        n = ip2.process(4,5);
        System.out.println(n); // prints 41

С лямбдами вы можете делать следующее:

        IntProcessor ip3 = (a,b)-> a*a + b*b;
        n = ip3.process(4,5);
        System.out.println(n); // prints 41
  1. (a,b) являются аргументами и могут принимать любые значения.
  2. Оператор -> указывает лямбду, и правая часть будет использовать переменные аргумента и что-то с ними делать.

Тип возвращаемого значения из лямбда-выражения должен соответствовать типу возвращаемого значения Functional Interface.

Компилятор позаботится о поиске соответствующего интерфейса и обеспечении соответствия аргументов их типам или сообщить об ошибке, если они этого не делают.

0 голосов
/ 19 января 2020

Ваш интерфейс IntProcessor - это функциональный интерфейс , так как он имеет Единственный абстрактный метод . Таким образом, его реализации (ваши ip1 и ip2) могут рассматриваться как лямбда-выражения.

Вы делаете реализации на лету. Например, ваш ip1 может рассматриваться как

@Override
int process (int input1, int input2) {
    return x*2 + y;
}

Так что я думаю, что фактический вывод вашего кода будет 13, 13 (x = 3 * 2 + 7, y = 7 + 2 * 3 ).

0 голосов
/ 19 января 2020

IntProcessor - это интерфейс, для его реализации необходимо определить функции, в данном случае process.

То, что вы делаете как лямбда-выражение при создании ip1 и ip2, определяет реализацию интерфейса то есть определение функции при создании объекта. В ip2 (x,y) представляет ввод реализации функции, это только способ объявления имен переменных, которые вы будете использовать в теле, и с точностью до -> вы определяете тело функции.

При вызове ip1.process (x, y) он вернет x*2+y При вызове ip2.process (x, y) он вернет a+b*2, где a - это значение x, переданное в функция и b - это значение y, переданное функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...