С версией 8 наша любимая бабушка Java идет в ногу со временем.

Scala и Closure, самый крутой внук семьи JDK, занимались крутыми вещами в мегаполисе под названием «Большие данные», и когда они вернулись в дом бабушки, они рассказали ей замечательные истории о параллельной обработке, не требующей синхронизации. неизменность и объединение функций и другие забавные мифы. Теперь внуки стали взрослыми, они пережили совершенно новую жизнь и преобразили свою бабушку. Бабушка не могла сразу развиваться в старости; но она была непредубежденной, старалась изо всех сил. Она сделала. Действительно. Ей нравилось то, что делали ее внуки.

Java 8 - это история этого легендарного преобразования.

Java изменилась, потому что игра изменилась в программировании.

Теперь наивысшим приоритетом является ни возможность повторного использования, ни расширяемость. Наивысший приоритет - разделить огромную задачу на отдельные небольшие задачи и распределить их по нескольким ядрам ЦП, даже по нескольким ЦП в сети, сократить время обработки и затем объединить результаты асинхронной обработки для получения окончательного результата. На изображении ниже вы можете увидеть простейший процесс уменьшения карты. Здесь каждый элемент карты и каждый элемент сокращения соответствует блоку программирования, который может работать на разных процессорах или на разных ядрах одного и того же процессора. Каждая единица программирования - это функция. Каждая функция карты выполняется одновременно и не влияет на другие функции.

Итак, современность - это время асинхронной, многоядерной, многопроцессорной обработки больших данных.

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

В Java 8 были встроены команды для асинхронных задач, такие как CompletableFuture, и классные структуры, такие как ForkJoinPool для параллельной обработки. И для асинхронного программирования, и для многопоточных, и для многопроцессорных программ требуются изолированные блоки программирования. Эти программные блоки не должны влиять друг на друга. Почему?

Подумайте так: вы повар в ресторане и работаете с другими поварами. Кто-то из вас готовит ингредиенты, кто-то готовит соус, кто-то готовит его и т. Д. Так устроена кухня. Если всем поварам будет разрешено вмешиваться во все шаги без какого-либо стандартного порядка или метода, все пойдет не так. Блюда со временем будут непостоянными.

Некоторым клиентам может действительно понравиться их еда. Но когда они посетили ресторан еще раз, еда могла быть совсем другой, не та же самая специя, тот же уровень приготовления… Потому что у всех вождей есть доступ к трапезе, и их поведение совершенно неожиданно. И нельзя повторно подать понравившуюся клиенту еду.

С изолированными модулями программирования вы гарантируете результат. Если другому повару действительно нужно приготовить еду, вы можете привести поваров в порядок и позволить им приготовить еду по очереди, а затем подать еду. Аналогия «каждому разрешено делать что угодно с этой тарелкой» соответствует проблемам параллелизма в программировании. И основная причина - изменчивость этого объекта.

Эти изолированные программные блоки называются «чистыми функциями». Руководители - это ядра ЦП или разные ЦП в сети. И еда - результат.

Если вы используете чистые функции во всем приложении, вы занимаетесь функциональным программированием, вот и все.

Что такое чистая функция?

Чистая функция не зависит от какого-либо другого экземпляра объекта или определения класса. Как вы знаете, в Java функция должна существовать либо в экземпляре объекта, если это функция экземпляра, либо в определении класса, если оно статическое.

С этого момента мы не будем называть их «функциями». Потому что это не так. Это методы класса в Java.

Настоящая чистая функция должна соответствовать этим ожиданиям:

Является ли Java 8 функциональным языком программирования?

Извини, Марио, полнофункциональное программирование находится в другом замке, на улице Вязов или где-то еще. Java 8 не является функциональным языком программирования, но, как я уже сказал, он изо всех сил пытается им быть.

Функции Java не соответствуют требованиям чистой функции.

Java 8 находится где-то между объектно-ориентированным программированием и функциональным программированием.

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

Ниже код Java обрабатывает данные файла CSV. Каждая строка выводит новый набор результатов либо путем преобразования данных, либо путем поиска, фильтрации и упорядочивания данных.

Как видите, мы фильтруем некоторые данные, размер которых больше 10. Синтаксис может показаться вам странным, но при правильном мышлении мы понимаем, что данные, превышающие 10, чем-то фильтруются. Мы не рассказали, как фильтровать данные. В традиционной программе мы бы сказали, что перебираем список, сравниваем каждый элемент с чем-то и, если возможно, помещаем его в целевой список. Вы видите здесь что-нибудь подобное? Нет, потому что мы тоже изменили свое мышление. Мы не используем императивное программирование (рассказываем каждую мелочь), а декларативное программирование (сделайте это. Вы несете ответственность за детали).

Кроме того, в этом коде нет циклов for. Потому что в функциональном программировании не используются итерации и итераторы. Они используют рекурсивные алгоритмы.

Элементы функционального программирования

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

Java 8 претендует на звание функционального языка программирования

Давайте посмотрим, как в Java 8 реализованы элементы функционального программирования:

В следующем разделе мы поговорим о неизменности объекта и его важности.

Вы можете продолжить чтение части 2:



Если вы хотите быть в курсе, вы можете подписаться на меня или на Javathlon.



Если вы хотите присоединиться к моему полному курсу Java 8 со специальной распродажей, перейдите по ссылке ниже:



Для руководств по функциональному программированию в Java 8 приведен отрывок из раздела функционального программирования: