Рубрики
Без рубрики

Функциональное программирование в Java #1 – Основы парадигмы

Основы парадигмы, + Структуры данных 1. Наточенное-если Это кр… Помеченный как java, функциональный, var, монада.

Функциональное программирование в Java (Серия из 2 частей)

1. Фундаментальный смысл

Часто можно услышать догадки, в Pull Requests например: “эй, вы можете реорганизовать этот код, используя функциональное программирование. Используйте фильтр, карту или уменьшите”. Но будет то, что programaçao functional об этом? Хорошо, уже заранее, что не. Что определяет парадигму функционального являются их характеристики: Поведение воспроизводится, ( Referential transparency ), функции чисто ( The absence of side-effects ) и неизменяемые значения ( Immutability ).

1.1. Referential transparency

Referential transparency относится к замене функции, их значение. В коде ниже, при замене функции сумма на сумму сумма, не есть изменения в поведении приложения, независимо от того, сколько раз вызывается.

final int dez = 10;
final int result = Math.sum(7, 3);
assertEquals(dez, result); // NAIL IT

// outro exemplo com Strings
final String snaked = "Invoice_ID";
final String result = "Invoice ID".replace(" ", "_");
assertEquals(snaked, result); // NAIL IT

Уже в коде ниже, это не происходит. Мы не можем предсказать значение result за случайное.

  final int cinco = 5;
  final int result = new Random().nextInt();
  assertEquals(cinco, result); // FAIL IT

1.2. Чистые функции

Эта функция подразделяется на два аспекта:

  1. Значение функции всегда будет одинаковым для одного и того же запись. Не важно, сколько раз мы называем Math.sum(7, 3) , результат всегда будет 10. Если запись мад ( Math.sum(10, 3) ), результат изменения также. Важно отметить, что этот фактор исключает любого рода, указывающее на внешний или достопримечательностей, изменчивый. Посмотрите на пример ниже:
private static Integer NINE = 9;

public Integer plusNine(final Integer n) {
  return n + NINE;
}

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

  1. Sua execução não possui побочные эффекты . Comportamentos como apontar para uma variavel эстетика, apontar para uma variavel форумы для оценки эффективности или изменения внутреннего состояния (или состояния здоровья)/| побочные эффекты . Диктует is to, становится ясно, что функции void имеют side-effects , иначе зачем призывать функция, которая не производит значение ?

1.3. Immutability

Неизменность-это понятие довольно известный, но мало работал, в основном, в мире объектно-ориентированный. Эта характеристика подразумевает построить объект, и не в состоянии изменить свое внутреннее состояние, то есть, его значение. В Java эти классы используются, являются незыблемыми, как, например: String , LocalDate , LocalDateTime , BigInteger , BigDecimal .

Пример 1. Strings

final String nome = "Gabriel";
final String nomeEmMinusculo = nome.toLowerCase();

assertEquals("Gabriel", nome); // NAIL IT
assertEquals("gabriel", nomeEmMinusculo); // NAIL IT

Пример 2. BigInteger

final BigInteger age = BigInteger.valueOf(15L);
final BigInteger agePlusFive = age.add(BigInteger.valueOf(5L));

assertEquals(15, age); // NAIL IT
assertEquals(20, agePlusFive); // NAIL IT

Em ambos exemplos o estado interno сделать объект нао се альтеру, танто BigInteger.добавить кванто Строка.В нижнем регистре производят ожидаемый результат, но на новый объект. Данный пример, однако, не относится:

Пример 3. ArrayList

final List integers = Arrays.asList(1, 2);
final Integer size = integers.size();
integers.add(3);

assertEquals(size, 2); // FAIL IT

Метод List.add производит boolean , вскоре, становится ясно, что изменение внутреннего состояния списка для хранения всему новому, иначе, List.add производить новый список. Мы можем сказать то, что есть side-effect и ArrayList не является неизменным.

2. Структура данных

В парадигме Функционального но с классами, которые инкапсулируют поведение и состояние. Вместо этого, мы работаем с структуры данных, которые делятся на три типа: Структур, изменчивый , структуры неизменными и структур persistêntes .

2.1. Структуры, изменчивый

Это в основном то, что мы видели пример 3 . Структура ArrayList Java изменчива по умолчанию. Каждая операция изменяет состояние внутренней структуры.

2.2. Структуры неизменными

Эти структуры не изменяются после строительства и в Java, операции бросают ошибки. Посмотрите на пример ниже:

final List integers = Collections.unmodifiableList(Arrays.asList(1, 2));
integers.add(3); // throws UnsupportedOperationException

О способе Неизменяемый список трансформация ума список нутавель эм ума новый список имутавель э, фейто иссо, тода предварительная оценка изменений о международном результате без ошибок Исключение из поддерживаемой операции .

2.3. Структуры постоянных

В такой структуре можно работать на нем же. Тем не менее, результат операции всегда возвращает новую структуру, основанную на старой, разделяя элементы, чтобы оптимизировать использование памяти. В Java мы не имеем эти структуры и горе, что приходит в Vavr . В библиотеке Vavr у нас есть структура, которая представляет собой связанный список, известный как List .

final List count = List.of(1, 2, 3);

Мы можем просмотреть список кол-во как:

Что делать, если manipularmos список заменив первый элемент, на 0 ?

final List newCount = count.tail().prepend(0);

Операции над удаляет первый элемент “голова” newCount , и, вернувшись на “сироп” .tail() , а также добавить элемент 0 в качестве первого элемента .вариант prepend(0) . В список стойких, операции, результат в новый список с именем newCount , при этом сохраняя предыдущие count нетронутыми с то же значение (1, 2 и 3).

Трюк здесь заключается в создании новой версии списка первичной, повторное использование тех же элементов, для оптимизации использования памяти.

3. Выводу о Р

Не думайте, что работа с функциональных языков-это быть 100%, в зависимости от характеристик. Есть моменты, где не da para escapar dos побочные эффекты . Например, любая функция, которая делает Ввод-вывод (журнал, поток, запрос/разрешение и т. Д.) é um побочный эффект .

Мы hablando как в функции, мне было любопытно, вы знаете, мне сказать, в чем разница между методом и функцией? Хорошо, метод не существует сама по себе, он нужен класс, чтобы существовать. Функции, с другой стороны, может жить в одиночестве, плавая в одном файле.

4. Дальнейшие действия

Скоро приведу второй пост из серии: Функциональное Программирование в Java #2 – Descomplicando Vavr.

5. Характеристика

Функциональное программирование в Java (Серия из 2 частей)

Оригинал: “https://dev.to/gsuaki/programacao-funcional-em-java-1-fundamentos-basicos-do-paradigma-3f95”