Java 11 компилятор не распознает данные c BiFunction в основном методе - PullRequest
3 голосов
/ 02 апреля 2020

Я пытался попробовать функциональное программирование в Java. Однако, когда я использую функциональный интерфейс в классе как переменную первого класса, мои переменные не распознаются при компиляции.

Я попытался сделать его локальной переменной в пределах main, но получил те же результаты.

Я что-то здесь упускаю?

Код:

import java.util.function.BiFunction;

class Question {
    static final BiFunction<Integer, Integer, Integer> add = (a,b) -> a+b;

    public static void main(String[] args) {
        System.out.println(Question.add(1,2));
    }
}

Получено сообщение об ошибке:

Question.java:7: error: cannot find symbol
        System.out.println(Question.add(1,2));
                                   ^
  symbol:   method add(int,int)
  location: class Question

Информация о версии:

javac 11.0.6
openjdk 11.0.6 2020-01-14
Ubuntu 18.04

Ответы [ 3 ]

2 голосов
/ 02 апреля 2020

Дело не в том, что он не распознает add, а в том, что add - это не метод - это экземпляр BiConsumer. Вы не можете вызвать его так, как если бы это был метод, вам нужно вызвать его apply метод:

System.out.println(Question.add.apply(1,2));
// Here -----------------------^
2 голосов
/ 02 апреля 2020

Question.add(1,2) - это вызов метода, а add - это поле.

class Question {
  static final BiFunction<Integer, Integer, Integer> add = (a, b) -> a+b;

  static final int add(int a, int b) {
    return add.apply(a, b);
  }

  public static void main(String[] args) {
    // calls the method
    System.out.println(Question.add(1,2));

    // gets the field and calls BiFunction's method
    System.out.println(Question.add.apply(1,2));
  }
}
2 голосов
/ 02 апреля 2020

Не существует специального синтаксиса для вызова функциональных интерфейсов .

System.out.println(Question.add(1,2));

Чтобы сделать вызов, необходимо вызвать фактическую функцию как обычно.

System.out.println(Question.add.apply(1, 2));

add переменная не нуждается в уточнении.

System.out.println(add.apply(1, 2));
...