Функциональное программирование — это парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций. В функциональном языке, при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат в обоих случаях, входные данные не могут измениться, выходные данные зависят только от входных.
Андрей Солнцев сделал отличную вводную — «ФП для чайников», показал разницу между императивным и функциональным стилями на примере алгоритма бутерброда, а так же рассказал как принципы ФП могут быть применены в программировании на языке Java. Java не предоставляет возможностей для ФП на уровне синтаксиса, и поэтому, приходится пользоваться сторонними библиотеками, такими как Google Collections.

 

Тут нельзя не процитировать Сергея Зефирова (он же thesz):

1. Программы лучше писать на Хаскеле.

2. То, что не получается написать на Хаскеле, лучше генерировать из описания на Хаскеле.

3. И только то, что совсем-совсем невозможно уложить в предыдущие два пункта, надо писать на другом ЯП.

От себя, желаю всем когда-нибудь освоить Хаскель. Как сказал Андрей, «если это не убьёт ваш мозг, то сделает его сильнее».