Как передать функцию в функцию java

Аватар пользователя Сергей Якимович
Сергей Якимович
22 декабря 2022

Передать функцию в качестве параметра в другую функцию можно разными способами. Рассмотрим некоторые из них.

1) Воспользуемся функциональным интерфейсом Predicate :

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class App {
    public static void main(String[] args) {
        List<String> list1 = List.of("1", "22", "333", "4444");
        List<String> filteredList1 = filterList(list1, x -> x.length() >= 3);
        System.out.println(filteredList1); // => [333, 4444]

        List<Integer> list2 = List.of(1, 2, 3, 4);
        List<Integer> filteredList2 = filterList(list2, x -> x >= 3);
        System.out.println(filteredList2); // => [3, 4]
    }

    public static <T> List<T> filterList(List<T> list, Predicate<T> rool) {
        return list.stream()
                .filter(x -> rool.test(x))
                .collect(Collectors.toList());
    }
}

2) Воспользуемся готовым функциональным интерфейсом UnaryOperator :

public static void superMethod(UnaryOperator<String> method) {
    String str = "Hexlet";
    String result = method.apply(str);
    System.out.println(result);
}

// вызов с передачей методов
public class App {
    public static void main(String[] args) throws Exception {
        // передадим стандартный метод
        superMethod(String::toUpperCase); // => HEXLET
        // передадим лямбда-функцию
        superMethod(s -> s + "!"); // => hexlet!
        // передадим собственный метод
        superMethod(App::reverse);  // => telxeh
    }

    public static String reverse(String str) {
        StringBuilder builder = new StringBuilder();
        builder.append(str);
        return builder.reverse().toString();
    }
}

3) Создадим собственный интерфейс и передадим объект этого типа в нашу функцию :

interface MyInterface {
    int count(int a, int b, int c);
}

public static void superMethodInterface(MyInterface method) {
    int a = 5, b = 10, c = 20;
    int result = method.count(a, b, c);
    System.out.println(result);
}

// вызов с передачей методов
public class App {
    public static void main(String[] args) throws Exception {
        MyInterface count = new MyInterface() {
            @Override
            public int count(int a, int b, int c) {
                return a + b + c;
            }
        };
        superMethodInterface(count); // => 35
        superMethodInterface((a,b,c) -> a * b * c); // => 1000
        superMethodInterface((a,b,c) -> a + b - c); // => -5
    }
}

4) Получим метод с помощью рефлексии и передадим его :

 public static void superMethodReflection(Object object, Method method) throws Exception {
    int a = 10;
    int b = 20;
    int result = (int) method.invoke(object, a, b);
    System.out.println(result);
}
// вызов с передачей методов
public class App {
    public static void main(String[] args) throws Exception {
        // передадим стандартный метод
        Method method = Integer.class.getDeclaredMethod("max", int.class, int.class);
        superMethodReflection(0, method); // => 20
        method = Integer.class.getDeclaredMethod("sum", int.class, int.class);
        superMethodReflection(0, method); // => 30
        // передадим собственный метод
        method = App.class.getDeclaredMethod("concate", int.class, int.class);
        superMethodReflection(new App(), method); // => 1020
    }

    public static int concate(int a, int b) {
        return Integer.parseInt("" + a + b);
    }
}
0 0

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию в Хекслете

Программирование

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

Тест-драйв

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Бесплатные курсы

Бесплатные курсы по тестированию, дата-аналитике, верстке, программированию на Python, Java, PHP и JavaScript.