Что такое анонимные функции в Dart?

Ответ

Анонимные функции (лямбда-функции или лямбда-выражения) в Dart — это функции без имени, объявляемые непосредственно в месте использования. Они особенно полезны для коротких операций, передаваемых в качестве аргументов (коллбэков) в методы коллекций, виджетов или таймеров.

Основные особенности:

  • Не имеют имени, объявляются через (параметры) { тело } или стрелочный синтаксис (параметры) => выражение.
  • Имеют доступ к переменным из окружающей лексической области видимости (замыкание).
  • Часто используются с forEach, map, where, reduce, Future.then, GestureDetector.onTap и другими API.

Примеры использования:

void main() {
  // Пример 1: Анонимная функция как аргумент forEach
  var numbers = [1, 2, 3];
  numbers.forEach((number) {
    print(number * 2);
  });

  // Пример 2: Стрелочный синтаксис для однострочных выражений
  var doubled = numbers.map((n) => n * 2).toList();
  print(doubled); // [2, 4, 6]

  // Пример 3: Сохранение в переменную
  var greet = (String name) => 'Hello, $name!';
  print(greet('Flutter')); // Hello, Flutter!

  // Пример 4: Использование в Flutter-виджете (коллбэк)
  // ElevatedButton(
  //   onPressed: () { // Анонимная функция
  //     print('Button pressed!');
  //   },
  //   child: Text('Press me'),
  // )
}

Использование анонимных функций делает код более компактным и локализует логику, которая не требует отдельного именованного объявления.

Ответ 18+ 🔞

Э, слушай, вот тебе про эти самые анонимные функции в Dart. Представь, что функция — это как работяга, которого ты нанимаешь на разовую работу. Так вот, зачем ему паспорт с именем, если он тут один раз кирпич поднимет и всё? Вот это и есть лямбда — безымянный работяга, который появляется прямо на месте, делает своё дело и растворяется в коде. Удобно, блядь, до безобразия.

Что за зверь такой:

  • Имени нет, ёпта. Объявляется прямо так: (параметры) { тело }. Если дело простое, в одну строчку, можно стрелочный синтаксис: (параметры) => выражение. Красота!
  • Видит всё вокруг. У него есть доступ к переменным из той области, где его объявили. Это называется замыкание — звучит умно, а на деле просто хитрая жопа, которая всё подглядывает.
  • Куда его только не суют. Особенно любят его пихать в методы для списков (forEach, map, where), в обработчики будущих результатов (Future.then) или, что самое частое, в коллбэки виджетов во Flutter. Нажал на кнопку — сработала анонимная функция, которую ты туда воткнул.

Смотри, как это выглядит в деле:

void main() {
  // Пример 1: Отправили анонимку поработать в forEach
  var numbers = [1, 2, 3];
  numbers.forEach((number) {
    print(number * 2); // Каждый элемент умножает на два и выводит
  });

  // Пример 2: Стрелочный синтаксис — для быстрых парней
  var doubled = numbers.map((n) => n * 2).toList(); // Всё то же самое, но короче
  print(doubled); // [2, 4, 6]

  // Пример 3: Можешь даже присвоить её переменной, как будто имя дал
  var greet = (String name) => 'Hello, $name!';
  print(greet('Flutter')); // Hello, Flutter! — работает же!

  // Пример 4: Классика жанра — кнопка во Flutter
  // ElevatedButton(
  //   onPressed: () { // Смотри, анонимка прямо здесь!
  //     print('Button pressed!'); // Нажали — выполнилось
  //   },
  //   child: Text('Press me'),
  // )
}

Вот и вся магия. Вместо того чтобы объявлять целую именованную функцию где-то в другом конце файла, ты пишешь логику прямо там, где она нужна. Код становится компактнее, читается легче — просто ебушки-воробушки, а не программирование. Главное — не переборщи, а то можно так налямбдить, что потом сам от своего кода охуеешь. Всё должно быть в меру.