Эта статья была авторизована для эксклюзивной публикации «Выбор серверной технологии».
Разработчики используют Java8 для написания сложных алгоритмов обработки коллекций, и им нужны только простые коды для эффективной работы на большем количестве процессоров.Это изначальное предназначение лямбда-выражений.
намекать: Функциональное программирование не имеет ничего общего с языком. Это идея. Функциональное программирование можно реализовать на любом языке. Разница лишь в сложности реализации.
В java лямбда сама по себе является приложением функционального программирования, так что же такое функциональное программирование?
1. Что такое функциональное программирование
Его трудно понять с точки зрения объяснения, поэтому вы можете почувствовать, что такое функциональное программирование, благодаря некоторым его функциям и преимуществам. Акцент делается на маркировке.
Обратитесь к статье Руан Ифэн:Вууху. Руань Ифэн.com/blog/2012/0…
1.1 Особенности
1. Функции — это «граждане первого сорта»так называемый«Гражданин первого класса»(первый класс), что означает, что функции находятся в равном положении с другими типами данных,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
Например, переменная печати в приведенном ниже коде — это функция, которую можно использовать в качестве аргумента для другой функции.
var print = function(i){ console.log(i);};
[1,2,3].forEach(print);
2. Используйте только «выражения», а не «утверждения».«Выражение» (выражение) представляет собой простой процесс операции, всегда имеют возвращаемое значение; «оператор» (оператор) заключается в выполнении некоторой операции, без возвращаемого значения. Функциональное программирование требует только выражений, а не инструкций. Это,每一步都是单纯的运算,而且都有返回值。
Причина в том, что函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。
«Отчеты» относятся к операциям чтения и записи в системе, поэтому они исключены.
Конечно, в практических приложениях нельзя не делать ввод-вывод. Таким образом, в процессе программирования функциональное программирование требует только того, чтобы ввод-вывод был ограничен до минимума, не должно быть ненужных операций чтения и записи, а процесс вычислений должен быть простым.
3. Отсутствие «побочных эффектов»
так называемый"побочный эффект"(побочный эффект), относится к взаимодействию между функцией и внешним миром (наиболее типичный случай — изменение значения глобальной переменной), что приводит к результатам, отличным от операции.
Функциональное программирование подчеркивает отсутствие «побочных эффектов», а это значит, что функция должна оставаться независимой, вся функция состоит в том, чтобы возвращать новое значение, и нет другого поведения.尤其是不得修改外部变量的值.
4. Не изменять состояние
Как упоминалось в предыдущем пункте, функциональное программирование просто возвращает новые значения,不修改系统变量
. Поэтому отсутствие изменения переменных также является важной его особенностью.
В других типах языков переменные часто используются для хранения «состояния». Отсутствие изменения переменной означает, что состояние не может быть сохранено в переменной. Функциональное программирование использует параметры для сохранения состояния, лучшим примером чего является рекурсия.
5. Прозрачность котировок
Ссылочная прозрачность, которая относится к函数的运行不依赖于外部变量或"状态",只依赖于输入的参数
, в любое время, пока параметры одинаковы, возвращаемое значение, полученное эталонной функцией, всегда будет одним и тем же.
С третьим и четвертым пунктами выше это очевидно. В других типах языков возвращаемое значение функции часто связано с состоянием системы.В разных состояниях возвращаемое значение отличается. Это называется «непрозрачностью ссылок» и не способствует наблюдению и пониманию поведения программы.
1.2 Преимущества
1. Простой код, быстрая разработка 2. Близкий к естественному язык, легкий для понимания
(1+2)*3-4
Выразить на функциональном языке
add(1,2).multiply(3).subtract(4)
3. Более удобное управление кодом
Он не зависит от состояния внешнего мира и не изменяет его.Пока заданы входные параметры, возвращаемый результат должен быть таким же. Поэтому каждую функцию можно рассматривать как независимый блок, что хорошо для модульного тестирования и отладки, а также для модульной композиции.
4. Простота «параллельного программирования»
Функциональное программирование не требует учета «взаимной блокировки», поскольку оно не изменяет переменные, поэтому вообще не возникает проблемы «блокировки» потоков. Вам не нужно беспокоиться о том, что данные одного потока будут изменены другим потоком, поэтому вы можете безопасно распределить работу между несколькими потоками и внедрить «параллелизм».
2. Пример функционального программирования
Функциональное программирование связано с отображением данных, а императивное программирование связано с шагами по решению проблемы.
В функциональном стиле нет присваиваний, поэтому цикла for нет, а операция цикла может быть достигнута только с помощью рекурсивных вызовов.
public class First {
public static void main(String[] args) {
int a = 10,b = 20;
int c = a+b;
System.out.println(c);
}
}
Этот код использует команды для представления программ и использует порядок выполнения команд для представления комбинаций программ, поэтому это не функциональное программирование. В значительной степени ориентированное на процесс мышление.
public class First {
public static void main(String[] args) {
int a = 10,b = 20;
add(a,b);
}
static int add(int a,int b){
int c = a+b;
return c;
}
}
Этот код использует функции для представления программ, но внутри он реализован комбинацией команд, что на самом деле не является функциональным программированием. Объектно-ориентированное мышление.
public class First {
public static void main(String[] args) {
int a = 10,b = 20;
add(a,b);
}
static int add(int a,int b){
return a+b;
}
}
Этот код использует функции для представления программ и использует комбинации функций для представления комбинаций программ, что является полностью функциональным программированием.
Отличия объектно-ориентированного, процедурного и функционального программирования
Разница между «процедурно-ориентированным» и «объектно-ориентированным» заключается в «инкапсуляции». Разница между «функциональным» и «объектно-ориентированным» заключается в том, что «внешнее состояние не используется». Это также отражено в трех фрагментах кода выше.
Если есть какие-либо возражения, пожалуйста, прокомментируйте ниже, спасибо.