Как создать список функций в Java?

Как я могу создать массив или список функций в Java 17 (или аналогичном)?

Ожидаемое гипотетическое использование:

    var myListOfFunctions = List.of(this::myFunction, MyClass::someOtherFunction);

Я получаю следующую ошибку:

Объект не является функциональным интерфейсом

Я намерен передавать функции и передавать им одни и те же данные.

Все ли функции имеют одинаковую сигнатуру?

Unmitigated 20.02.2023 20:12

Да, естественно.

Ahmed Tawfik 20.02.2023 20:21

Проблема в том, что информации о типе недостаточно, чтобы сделать вывод о параметризации List, поэтому по умолчанию используется List<Object>. Либо замените var фактическим типом (например, List<Function<Foo, Bar>>), либо используйте свидетельство типа (например, List.<Function<Foo, Bar>>of(...)). Замените Function<Foo, Bar> фактическим типом, который вы используете.

Slaw 20.02.2023 21:32

Я не знал о свидетелях типов (List.<TypeHere>) до ответа @NoDataFound. Спасибо за дополнительный контекст.

Ahmed Tawfik 20.02.2023 22:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны немного помочь Java для этого:

var myListOfFunctions = List.<Function<String,Integer>> of(this::myFunction, MyClass::someOtherFunction);

Это сгенерирует List<Function<String, Integer>>.

Или просто не используйте var...

Michael 20.02.2023 20:25

Зависит от прихоти компилятора: я почти уверен, что JDT (Eclipse) здесь не сработает.

NoDataFound 20.02.2023 21:37

Спасибо. Это сработало. Это была простая сигнатура с одним входом и одним выходом, так что это лучше всего подходит для моих нужд.

Ahmed Tawfik 20.02.2023 22:11
Ответ принят как подходящий

Во-первых, создайте функциональный интерфейс, представляющий общую сигнатуру всех функций. Примечание: может быть интерфейс из пакета java.util.function, который можно использовать для представления подписи, поэтому может не потребоваться создавать новый интерфейс.

// for example
@FunctionalInterface
interface MyFunction {
    int f(int a, int b); // this must match the signature of each function
}

Затем создайте List этого типа.

List<MyFunction> functions = List.of(this::myFunction, MyClass::someOtherFunction);

Спасибо, это кажется более полным, подходящим для более широкого круга посетителей, ищущих ответ на этот вопрос.

Ahmed Tawfik 20.02.2023 22:13

Другие вопросы по теме