← Назад к вопросам

Что такое функциональный интерфейс?

1.0 Junior🔥 172 комментариев
#Dart

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Функциональный интерфейс

Функциональный интерфейс (Functional Interface) — это интерфейс, который содержит ровно ОДИН абстрактный метод. Это концепция, введённая в Java 8 (хотя Dart имеет свою интерпретацию).

В контексте Dart и Flutter

В Dart нет явной концепции "функционального интерфейса" как в Java, но есть похожая идея — интерфейсы с одним методом, которые часто используются как callback'и или обработчики.

// Функциональный интерфейс в Dart
abstract class ValueBuilder<T> {
  T build(); // Один абстрактный метод
}

// Можно реализовать лаконично
class IntValueBuilder implements ValueBuilder<int> {
  @override
  int build() => 42;
}

Функции как интерфейсы

В Dart часто вместо функциональных интерфейсов используются функциональные типы:

// Вместо интерфейса используем Function type
typedef ValueBuilder<T> = T Function();

// Использование
ValueBuilder<String> stringBuilder = () => "Hello";
print(stringBuilder()); // Hello

// Или с параметрами
typedef Transformer<T, R> = R Function(T);

Transformer<int, String> intToString = (int value) => value.toString();
print(intToString(42)); // "42"

Примеры из Flutter

VoidCallback

// Функциональный интерфейс с нулевыми параметрами
typedef VoidCallback = void Function();

class Button {
  final VoidCallback onPressed;
  
  Button({required this.onPressed});
  
  void click() => onPressed();
}

// Использование
Button(
  onPressed: () => print("Clicked"),
).click();

ValueChanged

// Функциональный интерфейс с одним параметром
typedef ValueChanged<T> = void Function(T value);

class TextField {
  final ValueChanged<String> onChanged;
  
  TextField({required this.onChanged});
  
  void updateValue(String newValue) => onChanged(newValue);
}

// Использование
TextField(
  onChanged: (value) => print("New value: $value"),
).updateValue("Hello");

Практические примеры с пользовательскими интерфейсами

Пример 1: Builder паттерн

abstract class Widget {
  void render();
}

class ButtonBuilder {
  final VoidCallback onPressed;
  String label = "Click me";
  
  ButtonBuilder({required this.onPressed});
  
  Widget build() => _Button(label, onPressed);
}

class _Button implements Widget {
  final String label;
  final VoidCallback onPressed;
  
  _Button(this.label, this.onPressed);
  
  @override
  void render() {
    print("Button: $label");
    onPressed();
  }
}

// Использование
ButtonBuilder(onPressed: () => print("Pressed!"))
  ..label = "Submit"
  ..build()
  .render();

Пример 2: AsyncCallback

typedef AsyncCallback<T> = Future<T> Function();

class DataLoader<T> {
  final AsyncCallback<T> loader;
  
  DataLoader({required this.loader});
  
  Future<T> load() => loader();
}

// Использование
final userLoader = DataLoader<String>(
  loader: () async {
    await Future.delayed(Duration(seconds: 1));
    return "User loaded";
  },
);

await userLoader.load(); // User loaded

Пример 3: Predicate

typedef Predicate<T> = bool Function(T);

List<T> filter<T>(List<T> items, Predicate<T> predicate) {
  return items.where((item) => predicate(item)).toList();
}

// Использование
final numbers = [1, 2, 3, 4, 5];
final evenNumbers = filter(numbers, (n) => n % 2 == 0);
print(evenNumbers); // [2, 4]

Интерфейсы vs Функции

// Вариант 1: Интерфейс (классический OOP)
abstract class Calculator {
  int calculate(int a, int b);
}

class Adder implements Calculator {
  @override
  int calculate(int a, int b) => a + b;
}

// Вариант 2: Функция (функциональный стиль)
typedef Calculator = int Function(int, int);

Calculator adder = (a, b) => a + b;

// Использование
print(Adder().calculate(5, 3));  // 8
print(adder(5, 3));               // 8

Когда использовать

  • Callbacks — обработчики событий, нажатия кнопок
  • Builders — создание сложных объектов
  • Predicates — фильтрация и поиск
  • Transformers — преобразование данных
  • Listeners — подписка на изменения

Плюсы

  • Простота и лаконичность кода
  • Легко передавать как параметры
  • Отличная для функционального стиля программирования

Функциональные интерфейсы — это мощный инструмент в Dart для написания чистого и функционального кода.

Что такое функциональный интерфейс? | PrepBro