Лямбда-выражение применимо только для функционального интерфейса? - PullRequest
1 голос
/ 10 ноября 2019

Я только начал изучать Java 8. Там я читал, что лямбда-выражения можно применять только к функциональным интерфейсам. Но ниже код, я вижу с сайта Java. Здесь он использует класс MathOperation и ссылается на его методы с помощью лямбда-выражения, а не на какой-либо метод функционального интерфейса. Если бы кто-то помог мне понять это, было бы здорово.

package com.jcg.java;

import java.util.function.BiFunction;

class MathOperation {

    /**** Addition ****/
    public int add(int a, int b) {
        return a + b;
    }

    /**** Subtraction ****/
    public int sub(int a, int b) {
        return a - b;
    }
}

/***** Reference To An Instance Method Of A Particular Object *****/
public class MethodReferenceEx2 {

    public static void main(String[] args) {

        MathOperation op = new MathOperation();

        /**** Using Lambda Expression ****/
        System.out.println("--------------------Using Lambda Expression----------------------");
        BiFunction<Integer, Integer, Integer> add1 = (a, b) -> op.add(a, b);
        System.out.println("Addtion = " + add1.apply(4, 5));

        BiFunction<Integer, Integer, Integer> sub1 = (a, b) -> op.sub(a, b);
        System.out.println("Subtraction = " + sub1.apply(58, 5));

        /**** Using Method Reference ****/
        System.out.println("\n---------------------Using Method Reference---------------------");
        BiFunction<Integer, Integer, Integer> add2 = op::add;
        System.out.println("Addtion = " + add2.apply(4, 5));

        BiFunction<Integer, Integer, Integer> sub2 = op::sub;
        System.out.println("Subtraction = " + sub2.apply(58, 5));
    }
}

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Здесь он использует класс MathOperation и ссылается на его методы, используя лямбда-выражение, не ссылаясь на какой-либо метод функционального интерфейса.

Нет, все лямбда-выражения в этом коде реализуютBiFunction<Integer, Integer, Integer> интерфейс функции.

Тело лямбда-выражений может вызывать методы класса MathOperation. Он не должен ссылаться только на методы функционального интерфейса.

Когда вы хотите выполнить метод экземпляра функционального интерфейса, реализованного лямбда-выражением, вы вызываете метод функционального интерфейса, как в sub2.apply(58, 5).

0 голосов
/ 10 ноября 2019

как я понимаю, BiFunction - это функциональный интерфейс ... так что с "BiFunction add1 = (a, b) -> op.add (a, b);"Вы реализуете подпись метода apply ()! так что ты прав! с помощью лямбды вы можете просто реализовать интерфейсы одним абстрактным методом:

https://docs.oracle.com/javase/9/docs/api/java/util/function/BiFunction.html

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