Что такое функциональная парадигма программирования?

Ответ

Функциональная парадигма (ФП) — это стиль программирования, в котором программа рассматривается как вычисление математических функций, избегающее изменяемого состояния и побочных эффектов.

Основные принципы:

  1. Чистые функции (Pure Functions): Результат зависит только от входных аргументов. Нет побочных эффектов (изменения глобального состояния, ввод/вывод).
    // Чистая функция
    int add(int a, int b) {
        return a + b;
    }
  2. Неизменяемость (Immutability): Данные не изменяются после создания. Вместо модификации создаются новые структуры.
  3. Функции высшего порядка (Higher-Order Functions): Функции, которые могут принимать другие функции в качестве аргументов или возвращать их.
    // Функция высшего порядка 'map'
    List<Integer> result = numbers.stream()
                                  .map(x -> x * 2) // Принимает лямбда-функцию
                                  .toList();
  4. Декларативный стиль: Описывается что нужно сделать, а не как (в отличие от императивного стиля с циклами).

Пример на Java (использование Stream API):

import java.util.List;

List<Integer> numbers = List.of(1, 2, 3, 4);
// Декларативный стиль: "возьми числа, отфильтруй чётные, преобразуй в квадраты"
List<Integer> evenSquares = numbers.stream()
        .filter(n -> n % 2 == 0)     // Чистая функция-предикат
        .map(n -> n * n)             // Чистая функция-маппер
        .toList(); // Создаётся новый неизменяемый список
// evenSquares = [4, 16]

Java, начиная с версии 8, поддерживает элементы ФП через лямбда-выражения, Stream API и неизменяемые коллекции (List.of(), Map.copyOf()).

Ответ 18+ 🔞

А, слушай, смотри, вот эта ваша функциональная парадигма — это, блядь, как будто ты пришёл на кухню, а там всё идеально чисто, и тебе говорят: «Готовь, но ничего не пачкай, сука, и не трогай глобальный холодильник!». Ёпта, звучит как издевательство, но, оказывается, работать может.

Основные закидоны этой философии:

  1. Чистые функции, ёбта. Это святое. Функция как математик-отшельник: дали ей два числа — она тебе сумму и выдала. Больше нихуя. Ни в какой глобальный счётчик не плюнула, в консоль не нагадила, соседний массив не переписала. Как автомат по продаже газировки: кинул монету — получил банку. И всё.

    // Вот это чистота, блядь. Ангельская.
    int add(int a, int b) {
        return a + b; // Взял a, взял b, сделал дело — гуляй смело.
    }
  2. Неизменяемость, или «Руки прочь от моих данных!» Создал список — и всё, он теперь музейный экспонат. Хочешь что-то поменять? Создавай новый список, старый трогать низя. Да, памяти жрёт, как не в себя, но зато никаких сюрпризов, когда в десятом потоке тебе кто-то массив нахуй перетерли.

  3. Функции высшего порядка. Это когда функции такие понтовые, что могут других функций принимать, как аргументы, или даже рожать их на выходе. Типа главный инженер, который не сам паяет, а раздаёт задания.

    // Смотри, 'map' — он высшего порядка, царь и бог. Ему дали список и сказали: «Примени вот эту штуку (x -> x * 2) к каждому элементу».
    List<Integer> result = numbers.stream()
                                  .map(x -> x * 2) // Лямбда — это и есть та самая «другая функция», которую передали.
                                  .toList();
  4. Декларативный стиль. Вместо того чтобы орать: «Вася, возьми ящик, открой его, достань по одному кирпичу, проверь на чётность, если чётный — возведи в квадрат и положи в другую кучу!» — ты просто говоришь: «Мне нужны квадраты чётных чисел из этого ящика». И всё. Как заказал пиццу по телефону — тебе не объясняют, как повар тесто раскатывает.

Пример на Java, который всех задолбает своей правильностью:

import java.util.List;

List<Integer> numbers = List.of(1, 2, 3, 4); // Создали раз и навсегда. Неизменяемый, блядь, как скала.

// А теперь декларативненько так, с потягушками:
List<Integer> evenSquares = numbers.stream() // Запустили поток данных
        .filter(n -> n % 2 == 0)     // Отфильтровали чётные. Чистая функция-тестер.
        .map(n -> n * n)             // Каждого умножили на себя. Чистая функция-трансформер.
        .toList(); // И собрали в НОВЫЙ, блядь, список. Старый 'numbers' лежит нетронутый, святой дух.
// evenSquares = [4, 16]. Всё, пиздец, приехали.

Java, особенно после восьмой версии, эту моду подхватила. Лямбды (->), Stream API, эти все List.of() — это её попытки быть молодой и функциональной, хотя внутри она всё та же, сука, объектно-ориентированная тётя с кучей побочных эффектов. Но старается, блядь, старается.