---
title: Функциональные интерфейсы
seo:
  title: Функциональные интерфейсы — Java Developer
  description: "Тема «Функциональные интерфейсы» для собеседования Java Developer. Что такое функциональные интерфейсы? Для чего нужен функциональный интерфейс BiConsumer<T,U>?"
---

[Все темы Java Developer](/java-developer)

## <strong>Что такое функциональные интерфейсы?</strong> [#q-14bee738d69b81eab1b3d23bfe5ac4ea]

Функциональный интерфейс задаёт единственный функциональный контракт абстрактного метода. Аннотация @FunctionalInterface необязательна и ставится на интерфейсе, а не на методе. Default- и static-методы не мешают; методы, совпадающие с public-методами Object, не учитываются при определении функционального контракта.

<strong>Основные характеристики функциональных интерфейсов&#58;</strong>

1. <strong>Один абстрактный метод</strong>&#58; Функциональный интерфейс может
   содержать только один абстрактный метод, но может также содержать любое
   количество методов по умолчанию (default methods) или статических методов.

1. <strong>Аннотация</strong> <code>&#64;FunctionalInterface</code>&#58; Для
   обозначения функционального интерфейса используется аннотация
   <code>&#64;FunctionalInterface</code>. Это помогает компилятору проверить,
   что интерфейс соответствует требованиям функционального интерфейса (имеет
   только один абстрактный метод).

Примеры стандартных функциональных интерфейсов, включенных в стандартную библиотеку Java (package <code>java&#46;util&#46;function</code>)&#58;

- <code>Supplier&#60;T&#62;</code>&#58; поставщик (не принимает аргументов,
  возвращает значение типа T).

- <code>Consumer&#60;T&#62;</code>&#58; потребитель (принимает аргумент типа T,
  не возвращает значения).

- <code>Predicate&#60;T&#62;</code>&#58; предикат (принимает аргумент типа T,
  возвращает boolean).

- <code>Function&#60;T&#44; R&#62;</code>&#58; функция (принимает аргумент типа
  T, возвращает значение типа R).

<strong>Пример&#58;</strong>

```java
@FunctionalInterface
interface MyFunction {
    void myMethod(String arg);
}

public class Main {
    public static void main(String[] args) {
        // Использование лямбда-выражения для реализации функционального интерфейса
        MyFunction func = (arg) -> System.out.println("Hello, " + arg);
        func.myMethod("world");
    }
}
```

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## <strong>Для чего нужен функциональный интерфейс</strong> <code>BiConsumer&#60;T&#44;U&#62;</code><strong>?</strong> [#q-14bee738d69b8103b3b0e8fec27b51c5]

Функциональный интерфейс <code>BiConsumer&#60;T&#44; U&#62;</code> в Java представляет собой интерфейс, который определяет операцию, принимающую два входных аргумента (типов <code>T</code> и <code>U</code>) и не возвращающую результат (void). Он используется для передачи операций, которые принимают два аргумента и выполняют какие-то действия с ними, например, их выводят на экран, сохраняют в базу данных или выполняют любую другую операцию.

<strong>Основные аспекты и применения</strong>
<code>BiConsumer&#60;T&#44; U&#62;</code>
<strong>&#58;</strong>

1. <strong>Параметризация типами T и U</strong>&#58; Эти типы могут быть любыми
   объектными типами данных, например, <code>Integer</code>, <code>String</code>
   , <code>Object</code> и т.д.

1. <strong>Нет возвращаемого значения</strong>&#58; Метод
   <code>accept&#40;T t&#44; U u&#41;</code> интерфейса <code>BiConsumer</code>
   ничего не возвращает (<code>void</code>).

1. <strong>Пример использования</strong>&#58;

   ```java
   import java.util.function.BiConsumer;

   public class Main {
       public static void main(String[] args) {
           BiConsumer<String, Integer> printLength = (str, num) ->
               System.out.println("Length of '" + str + "' is " + num);

           printLength.accept("Java", 4);
           printLength.accept("OpenAI", 6);
       }
   }
   ```

   Здесь <code>printLength</code> — это экземпляр функционального интерфейса <code>BiConsumer</code>, который принимает строку и целое число (длину строки) и выводит информацию о длине строки на экран.

1. <strong>Использование в потоковых операциях</strong>&#58;
   <code>BiConsumer</code> может использоваться в потоковых операциях для
   выполнения параллельных действий над парами данных.

<code>BiConsumer&#60;T&#44; U&#62;</code> полезен в случаях, когда требуется
выполнить операции, которые работают с двумя аргументами, не возвращая
результат. Это удобно для реализации методов обратного вызова, для обработки
данных в парах или для выполнения действий над двумя различными аргументами
одновременно.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## <strong>Для чего нужен функциональный интерфейс</strong> <code>BiFunction&#60;T&#44;U&#44;R&#62;</code><strong>?</strong> [#q-14bee738d69b81b183e7c6f2a88308b3]

Функциональный интерфейс <code>BiFunction&#60;T&#44; U&#44; R&#62;</code> в Java представляет собой интерфейс, который определяет функцию, принимающую два входных аргумента (типов <code>T</code> и <code>U</code>) и возвращающую результат (типа <code>R</code>). Он используется для передачи операций, которые принимают два аргумента и возвращают какое-то значение на основе этих аргументов.

<strong>Основные аспекты и применения</strong>
<code>BiFunction&#60;T&#44; U&#44; R&#62;</code>
<strong>&#58;</strong>

1. <strong>Параметризация типами T, U и R</strong>&#58; Эти типы могут быть
   любыми объектными типами данных, например, <code>Integer</code>,
   <code>String</code>, <code>Object</code> и т.д. <code>R</code> обозначает тип
   возвращаемого значения.

1. <strong>Метод</strong> <code>apply</code>&#58; Интерфейс
   <code>BiFunction</code> содержит абстрактный метод
   <code>R apply&#40;T t&#44; U u&#41;</code>, который принимает два аргумента
   типов <code>T</code> и <code>U</code> и возвращает значение типа
   <code>R</code>.

1. <strong>Пример использования</strong>&#58;

   ```java
   import java.util.function.BiFunction;

   public class Main {
       public static void main(String[] args) {
           BiFunction<String, Integer, String> repeat = (str, count) -> {
               StringBuilder result = new StringBuilder();
               for (int i = 0; i < count; i++) {
                   result.append(str);
               }
               return result.toString();
           };

           String repeated = repeat.apply("Hello", 3);
           System.out.println(repeated);  // Выведет: HelloHelloHello
       }
   }
   ```

   Здесь <code>repeat</code> — это экземпляр функционального интерфейса <code>BiFunction</code>, который принимает строку (<code>String</code>) и целое число (<code>Integer</code>) и возвращает строку (<code>String</code>), повторяющуюся заданное количество раз.

1. <strong>Использование в потоковых операциях</strong>&#58;
   <code>BiFunction</code> может использоваться в потоковых операциях для
   преобразования или комбинирования данных, которые требуют двух входных
   аргументов.

<code>BiFunction&#60;T&#44; U&#44; R&#62;</code> полезен в случаях, когда нужно
выполнить операции, зависящие от двух аргументов, и вернуть какой-то результат.
Он обеспечивает гибкость и возможность создавать функции, способные работать с
двумя различными типами данных и возвращать результат, соответствующий задаче.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## <strong>Для чего нужен функциональный интерфейс</strong> <code>BiPredicate&#60;T&#44;U&#62;</code><strong>?</strong> [#q-14bee738d69b8198b838ce3ed6b9fbfc]

Функциональный интерфейс <code>BiPredicate&#60;T&#44; U&#62;</code> в Java представляет собой интерфейс, который определяет предикат — операцию, принимающую два входных аргумента (типов <code>T</code> и <code>U</code>) и возвращающую булево значение (<code>boolean</code>). Он используется для передачи операций, которые проверяют условие на основе двух аргументов и возвращают <code>true</code> или <code>false</code>.

<strong>Основные аспекты и применения</strong>
<code>BiPredicate&#60;T&#44; U&#62;</code>
<strong>&#58;</strong>

1. <strong>Параметризация типами T и U</strong>&#58; Эти типы могут быть любыми
   объектными типами данных, например, <code>Integer</code>, <code>String</code>
   , <code>Object</code> и т.д.

1. <strong>Метод</strong> <code>test</code>&#58; Интерфейс
   <code>BiPredicate</code> содержит абстрактный метод
   <code>boolean test&#40;T t&#44; U u&#41;</code>, который принимает два
   аргумента типов <code>T</code> и <code>U</code> и возвращает булево значение
   (<code>true</code> или <code>false</code>).

1. <strong>Пример использования</strong>&#58;

   ```java
   import java.util.function.BiPredicate;

   public class Main {
       public static void main(String[] args) {
           BiPredicate<String, Integer> isLengthGreaterThan = (str, length) -> str.length() > length;

           boolean result1 = isLengthGreaterThan.test("Java", 3);
           System.out.println("Is 'Java' longer than 3? " + result1);  // Выведет: true

           boolean result2 = isLengthGreaterThan.test("Python", 6);
           System.out.println("Is 'Python' longer than 6? " + result2);  // Выведет: false
       }
   }
   ```

   Здесь <code>isLengthGreaterThan</code> — это экземпляр функционального интерфейса <code>BiPredicate</code>, который проверяет длину строки (<code>String</code>) и возвращает <code>true</code>, если длина больше указанного числа.

1. <strong>Использование в потоковых операциях</strong>&#58;
   <code>BiPredicate</code> может использоваться в потоковых операциях для
   фильтрации данных, зависящей от двух входных аргументов.

<code>BiPredicate&#60;T&#44; U&#62;</code> полезен в ситуациях, когда требуется
проверять условия, зависящие от двух различных типов данных, и возвращать
результат в виде булевого значения. Он обеспечивает гибкость и возможность
создавать функции для сложных логических проверок, которые требуют двух
аргументов.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## <strong>Для чего нужны функциональные интерфейсы вида</strong> <code>\_To_Function</code><strong>?</strong> [#q-14bee738d69b81f7a1f0d91856a23d90]

Функциональные интерфейсы вида <code>\_To_Function</code> в Java представляют собой группу интерфейсов, которые принимают один тип данных и возвращают другой тип данных. Они используются для передачи операций, которые преобразуют входные данные одного типа в выходные данные другого типа.

<strong>Основные применения функциональных интерфейсов вида</strong>
<code>&#95;To&#95;Function</code>
<strong>&#58;</strong>

{/* prettier-ignore */}
1. <strong>Преобразование данных</strong>&#58; Интерфейсы, такие как <code>Function&#60;T&#44; R&#62;</code>, <code>ToIntFunction&#60;T&#62;</code>, <code>ToDoubleFunction&#60;T&#62;</code>, <code>ToLongFunction&#60;T&#62;</code>, <code>LongToDoubleFunction</code>, и другие, используются для преобразования данных из одного типа в другой.

1. <strong>Потоковые операции</strong>&#58; В Java 8 и более поздних версиях многие из этих интерфейсов широко используются в потоковых операциях (<code>Stream API</code>) для выполнения преобразований данных или извлечения нужных значений из объектов.

1. <strong>Функции обратного вызова (Callback functions)</strong>&#58; Они часто используются как функции обратного вызова, когда требуется выполнить определенные операции над данными и вернуть результат.

Вот некоторые примеры функциональных интерфейсов вида <code>\_To_Function</code> и их основные задачи&#58;

{/* prettier-ignore */}
- <code>Function&#60;T&#44; R&#62;</code>&#58; Принимает аргумент типа <code>T</code> и возвращает результат типа <code>R</code>.

- <code>ToIntFunction&#60;T&#62;</code>, <code>ToDoubleFunction&#60;T&#62;</code>, <code>ToLongFunction&#60;T&#62;</code>&#58; Принимают аргумент типа <code>T</code> и возвращают примитивные значения <code>int</code>, <code>double</code>, <code>long</code> соответственно.

- <code>LongToDoubleFunction</code>, <code>IntToDoubleFunction</code>&#58; Принимают примитивные значения <code>long</code> или <code>int</code> и возвращают значение <code>double</code>.

- <code>DoubleToIntFunction</code>, <code>DoubleToLongFunction</code>&#58; Принимают значение <code>double</code> и возвращают примитивные значения <code>int</code> или <code>long</code>.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::
