SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Функциональное программирование на Яве DevClub 26.11.2009 Andrei Solntsev
О чём это мы? Данный пптах даёт представление   о методах Функционального Программирования и их применении в ООП-языках типа  Java Кое-где придётся подумать!
Оглавление ,[object Object],[object Object],[object Object],[object Object],[object Object]
Введение в ФП Вычисление -  последовательное выполнение команд, изменяющих состояние . Императивное программирование Функциональное программирование Вычисление - нахождение значения выражения КАК Выражения образованы из функций для комбинации  базовых значений и других функций Программа   состоит из нескольких последовательных команд . ЧТО против
Алгоритм На каком примере всем объясняют понятие «алгоритм»? Бутерброд!
Алгоритм бутерброда Фунцкия   createSandwich ,[object Object],[object Object],[object Object],[object Object],Императивный стиль return Функциональный стиль положи ( сыр , намажь ( масло ,  хлеб ) )
Алгоритм бутерброда Что ,  если мы хотим  использовать  колбасу  вместо  сыра  ? Давайте передавать колбасу/сыр как входной параметр функции Нет проблем !
Алгоритм бутерброда ,[object Object],[object Object],[object Object],[object Object],Function  createSandwich ( низ ,  середина ,  верх ) return  положи ( верх , намажь ( середина ,  низ ) ) Function  createSandwich ( низ ,  середина ,  верх ) Нет проблем ! хлеб масло колбаса
Алгоритм бутерброда Что ,  если мы хотим не  намазывать  масло, а  класть  кусками? Императивное программирование :  Проблема ! Функциональное   программирование :  по-прежнему нет проблем
Алгоритм бутерброда ,[object Object],[object Object],[object Object],[object Object],Function  createSandwich ( низ ,  середина ,  верх ,  способ ) хлеб масло колбаса класть Альтернативный вариант :  создать 2 разные функции    Дублирование кода Императивное программирование :  Проблема ! Больше способов – больше  IF’ ов
Алгоритм бутерброда return put ( верх , action ( середина, низ ) ) Function  createSandwich ( низ ,  середина ,  верх ,  action ) хлеб масло колбаса класть Action   – это функция с двумя аргументами ,[object Object],[object Object],[object Object],createSandwich   – функция более  высокого порядка   ( higher-order  function ), которая принимает  другую функцию как аргумент Функциональное   программирование :  нет проблем
Функциональный бутерброд
Основные свойства ФП Что такое Функциональное Программмирование ? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Функциональные языки ,[object Object],[object Object],[object Object],Там, где традиционная императивная программа использует цикл  для прохождения по списку, функциональный стиль использует  функцию высокого порядка  map,  которая принимает другую  функцию и список, применяет эту функцию к каждому элементу  списка и возвращает список из результатов. ,[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object]
Примеры кода на  Haskell ,[object Object],[object Object],functions add  1   2 =   3 add  6   9 =   1 5 add  1  =   ? Ух ты ! add  1  =  функция типа  Integer -> Integer Currying http://en.wikipedia.org/wiki/Currying
Примеры кода на  Haskell ,[object Object],[object Object],functions inc  :: Integer -> Integer inc   = add 1  map   :: (a->b) -> [a] -> [b] map  f  []       =  [] map  f (x:xs)    =  f x : map f xs Uncurried function F unction can be returned as a value  ! Higher-order function curried function
[object Object],Примеры кода на  Haskell Бесконечные   структуры данных numsFrom n   =   n   :   numsFrom (n+1)  squares   = map (^2) (numsfrom 0)  take 5 squares => [0,1,4,9,16]  Это выражение вычисляется за конечное число шагов Потому что  Lazy Evaluation!
Примеры кода в стиле ФП в  Java java.util.Properties Properties properties = new Properties(); properties.setProperty(“firstName", groom.getFirstName()); properties.setProperty(“lastName", groom.getLastName()); properties.setProperty(“salary", groom.getSalary()); return  parameters; return Императивный Функциональный return  new Properties() .setProperty(“firstName", groom.getFirstName()) .setProperty(“lastName", groom.getLastName()) .setProperty(“salary", groom.getSalary()); ,[object Object],[object Object],йа баго нихт баго
Примеры кода в стиле ФП в  Java java.lang.StringBuffer StringBuffer sb = new StringBuffer(); sb.append(“a”); sb.append(“b”); sb.append(“c”); return sb.toString(); return new StringBuffer() .append(“a”); .append(“b”); .append(“c”) .toString(); Императивный Функциональный ,[object Object],[object Object]
ФП :  За и против За ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Против Пример :  алгоритм быстрой сортировки ( Quick Sort )
Quicksort на языке Haskell ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Сравните с Quicksort на языке C:
Quicksort на языке C ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ФП :  За и против В языках типа  Java,  ФП хорошо подходит для  реализации бизнес-логики и обработки списков Проще придумывать, писать и поддерживать ПО, но программист имеет меньше контроля над тем,  что происходит во время выполнения программы. За Вывод
[object Object],[object Object],[object Object],[object Object],[object Object]
25 ый   кадр 25 ый   кадр
Бизнес-логика с помощью ФП Класс  GroomFilter List  suitableGrooms  = new ArrayList(); for (groom in allGrooms) { if ( minAge > -1 && groom.getAge() < minAge ) continue; if (maxAge > -1 && groom.getAge() > maxAge) continue; suitableGrooms .add(groom); } return  suitableGrooms ; List filterGrooms(List allGrooms ,  int minAge, int maxAge) Если  age  =  -1 , то возраст  проверять не нужно Отфильтровывает женихов Как сделать более  сложные проверки?
Бизнес-логика с помощью ФП Класс  GroomFilter List suitableGrooms = new ArrayList(); for (groom in allGrooms) { if ( groomChecker .apply(groom)) suitableGrooms.add(groom); } return suitableGrooms; List filterGrooms(List allGrooms,  Predicate groomChecker ) Передаём функцию  как параметр
Google collections package com.google.common.base; public interface  Predicate <T> { { /** *  Возвращает  true  или  false  для данного объекта */ boolean  apply (T input); } http://bwinterberg.blogspot.com/2009/09/introduction-to-google-collections.html http://code.google.com/p/google-collections/
Google collections package com.google.common.base; public class  Predicates   { static <T> Predicate<T>  alwaysTrue (); static <T> Predicate<T>  alwaysFalse (); static <T> Predicate<T>  isNull () ; static <T> Predicate<T>  notNull (); static <T> Predicate<T>  not (Predicate<T> predicate); static <T> Predicate<T>  and (Predicate<? super T>... components); … }
Google collections package com.google.common.collect; public class  Collections2   { static <E> Collection<E>  filter ( Collection<E>  unfiltered , Predicate<? super E>  predicate )  static <F, T> Collection<T>  transform ( Collection<F>  fromCollection ,   Function<? super F, T>  function ) }
Бизнес-логика с помощью ФП Класс  GroomFilter return  Collections2.filter (allGrooms, groomChecker); List filterGrooms(List allGrooms,  Predicate groomChecker ) Функция  filterGrooms  становится ещё проще
Бизнес-логика с помощью ФП Клиент  1 List suitableGrooms grooms = GroomFilter.filterGrooms(…, new Predicate<Groom>() { public boolean apply(Groom groom) {   return groom.getAge() > 23; } } ); Клиент  2 List suitableGrooms = GroomFilter.filterGrooms(…, Predicates.alwaysTrue() ); Closure  –  Объект, представляющий функцию Анонимные классы часто используются в качестве  closures
Применение ФП :  Фильтры Дано :  список имён женихов . Найти :  все имена, начинающиеся на  “Mr.” List  gentlemen  = new LinkedList(); for (Iterator it =  groomsNames .iterator(); it.hasNext(); ) { String name = (String) it.next(); if (name != null &&  name.startsWith(“Mr.”)) {   gentlemen .add(name); } } return  gentlemen ; Императивное программирование:
Применение ФП :  Фильтры Функциональное программирование: import com.google.common.collect.Collections2; return  Collections2 . filter( allGrooms, StringPredicates.startsWith( “Mr.” ) ) ; Дано :  список имён женихов . Найти :  все имена, начинающиеся на  “Mr.”
Применение ФП :  Функции Дано :  список женихов Найти :  список имён женихов List  groomsNames  = new ArrayList(); for (Iterator it =  allGrooms .iterator(); it.hasNext(); ) { Groom groom = (Groom) it.next(); groomsNames .add(groom.getName()); } return  groomsNames ; Императивное программирование
Применение ФП :  Функции import com.google.common.collect.Collections2; return  Collections2. transform(  allGrooms , new Function<Groom, String> () {   public String apply(Groom groom)   { return groom.getName();   } } ) ; Функциональное программирование Дано :  список женихов Найти :  список имён женихов На первый взгляд, не столь красиво, но может быть вынесено в отдельный класс и многократно использовано!
Google collections GC  позволяет сделать и более элегантные конструкции boolean  result  =  and( not( in(list1) ), in(list2), in(list3)).apply(&quot;1&quot;); Collection names =  Joiner.on(&quot;; &quot;).useForNull(&quot;B000&quot;).join(filtered);
Эпи log 4 j ,[object Object],Скачайте себе  Haskell  и поиграйтесь на досуге. Если это не убьёт ваш мозг, то сделает его сильнее.

Weitere ähnliche Inhalte

Was ist angesagt?

Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Dev2Dev
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...etyumentcev
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповetyumentcev
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаAnton Arhipov
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Moscow.pm
 
Haskell
HaskellHaskell
HaskellDevDay
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 

Was ist angesagt? (17)

Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
 
бегун
бегунбегун
бегун
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принципов
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
XML Magic
XML MagicXML Magic
XML Magic
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Kotlin with API tests
Kotlin with API testsKotlin with API tests
Kotlin with API tests
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Python
PythonPython
Python
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
 
Haskell
HaskellHaskell
Haskell
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 

Andere mochten auch

Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Andrei Solntsev
 
50 оттенков play!
50 оттенков play!50 оттенков play!
50 оттенков play!Andrei Solntsev
 
Android (Devclub.eu, 30.03.2010)
Android (Devclub.eu, 30.03.2010)Android (Devclub.eu, 30.03.2010)
Android (Devclub.eu, 30.03.2010)Andrei Solntsev
 
The fast and the continuous (SeleniumCamp 2014)
The fast and the continuous (SeleniumCamp 2014)The fast and the continuous (SeleniumCamp 2014)
The fast and the continuous (SeleniumCamp 2014)Andrei Solntsev
 
Static website-generators
Static website-generatorsStatic website-generators
Static website-generatorsAndrei Solntsev
 
The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16Andrei Solntsev
 
What is master @ SeleniumConf 2015
What is master @ SeleniumConf 2015What is master @ SeleniumConf 2015
What is master @ SeleniumConf 2015Andrei Solntsev
 
Good test = simple test (with selenide)
Good test = simple test (with selenide)Good test = simple test (with selenide)
Good test = simple test (with selenide)Andrei Solntsev
 
Liquibase & Flyway @ Baltic DevOps
Liquibase & Flyway @ Baltic DevOpsLiquibase & Flyway @ Baltic DevOps
Liquibase & Flyway @ Baltic DevOpsAndrei Solntsev
 
Bullshit driven development
Bullshit driven developmentBullshit driven development
Bullshit driven developmentAndrei Solntsev
 

Andere mochten auch (14)

Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)
 
50 оттенков play!
50 оттенков play!50 оттенков play!
50 оттенков play!
 
Android (Devclub.eu, 30.03.2010)
Android (Devclub.eu, 30.03.2010)Android (Devclub.eu, 30.03.2010)
Android (Devclub.eu, 30.03.2010)
 
WTF Code @ jug.lv
WTF Code @ jug.lvWTF Code @ jug.lv
WTF Code @ jug.lv
 
The fast and the continuous (SeleniumCamp 2014)
The fast and the continuous (SeleniumCamp 2014)The fast and the continuous (SeleniumCamp 2014)
The fast and the continuous (SeleniumCamp 2014)
 
Real-life unit tests
Real-life unit testsReal-life unit tests
Real-life unit tests
 
Static website-generators
Static website-generatorsStatic website-generators
Static website-generators
 
The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16
 
What is master @ SeleniumConf 2015
What is master @ SeleniumConf 2015What is master @ SeleniumConf 2015
What is master @ SeleniumConf 2015
 
Extreme banking
Extreme bankingExtreme banking
Extreme banking
 
Good test = simple test (with selenide)
Good test = simple test (with selenide)Good test = simple test (with selenide)
Good test = simple test (with selenide)
 
Liquibase & Flyway @ Baltic DevOps
Liquibase & Flyway @ Baltic DevOpsLiquibase & Flyway @ Baltic DevOps
Liquibase & Flyway @ Baltic DevOps
 
Bullshit driven development
Bullshit driven developmentBullshit driven development
Bullshit driven development
 
The Dangers of Cucumber
The Dangers of CucumberThe Dangers of Cucumber
The Dangers of Cucumber
 

Ähnlich wie Functional Programming Dev Club 2009 - final

ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василийsolit
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
 

Ähnlich wie Functional Programming Dev Club 2009 - final (20)

ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
бегун
бегунбегун
бегун
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
About Python
About PythonAbout Python
About Python
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
PowerShell
PowerShellPowerShell
PowerShell
 
Введение в Django
Введение в DjangoВведение в Django
Введение в Django
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 

Mehr von Andrei Solntsev

Тройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOSТройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOSAndrei Solntsev
 
Flaky tests. Метод.
Flaky tests. Метод. Flaky tests. Метод.
Flaky tests. Метод. Andrei Solntsev
 
Батл: Тесты или не тесты?
Батл: Тесты или не тесты?Батл: Тесты или не тесты?
Батл: Тесты или не тесты?Andrei Solntsev
 
Как получить чёрный пояс по программированию
Как получить чёрный пояс по программированиюКак получить чёрный пояс по программированию
Как получить чёрный пояс по программированиюAndrei Solntsev
 
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euSelenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euAndrei Solntsev
 
Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise EditionAndrei Solntsev
 
Evolutionary Database Design
Evolutionary Database DesignEvolutionary Database Design
Evolutionary Database DesignAndrei Solntsev
 
Functional Programming In Java
Functional Programming In JavaFunctional Programming In Java
Functional Programming In JavaAndrei Solntsev
 

Mehr von Andrei Solntsev (9)

Тройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOSТройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOS
 
Flaky tests. Метод.
Flaky tests. Метод. Flaky tests. Метод.
Flaky tests. Метод.
 
Батл: Тесты или не тесты?
Батл: Тесты или не тесты?Батл: Тесты или не тесты?
Батл: Тесты или не тесты?
 
Как получить чёрный пояс по программированию
Как получить чёрный пояс по программированиюКак получить чёрный пояс по программированию
Как получить чёрный пояс по программированию
 
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.euSelenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.eu
 
Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise Edition
 
Kiss.devclub ee.est
Kiss.devclub ee.estKiss.devclub ee.est
Kiss.devclub ee.est
 
Evolutionary Database Design
Evolutionary Database DesignEvolutionary Database Design
Evolutionary Database Design
 
Functional Programming In Java
Functional Programming In JavaFunctional Programming In Java
Functional Programming In Java
 

Functional Programming Dev Club 2009 - final

  • 1. Функциональное программирование на Яве DevClub 26.11.2009 Andrei Solntsev
  • 2. О чём это мы? Данный пптах даёт представление о методах Функционального Программирования и их применении в ООП-языках типа Java Кое-где придётся подумать!
  • 3.
  • 4. Введение в ФП Вычисление - последовательное выполнение команд, изменяющих состояние . Императивное программирование Функциональное программирование Вычисление - нахождение значения выражения КАК Выражения образованы из функций для комбинации базовых значений и других функций Программа состоит из нескольких последовательных команд . ЧТО против
  • 5. Алгоритм На каком примере всем объясняют понятие «алгоритм»? Бутерброд!
  • 6.
  • 7. Алгоритм бутерброда Что , если мы хотим использовать колбасу вместо сыра ? Давайте передавать колбасу/сыр как входной параметр функции Нет проблем !
  • 8.
  • 9. Алгоритм бутерброда Что , если мы хотим не намазывать масло, а класть кусками? Императивное программирование : Проблема ! Функциональное программирование : по-прежнему нет проблем
  • 10.
  • 11.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. ФП : За и против В языках типа Java, ФП хорошо подходит для реализации бизнес-логики и обработки списков Проще придумывать, писать и поддерживать ПО, но программист имеет меньше контроля над тем, что происходит во время выполнения программы. За Вывод
  • 24.
  • 25. 25 ый кадр 25 ый кадр
  • 26. Бизнес-логика с помощью ФП Класс GroomFilter List suitableGrooms = new ArrayList(); for (groom in allGrooms) { if ( minAge > -1 && groom.getAge() < minAge ) continue; if (maxAge > -1 && groom.getAge() > maxAge) continue; suitableGrooms .add(groom); } return suitableGrooms ; List filterGrooms(List allGrooms , int minAge, int maxAge) Если age = -1 , то возраст проверять не нужно Отфильтровывает женихов Как сделать более сложные проверки?
  • 27. Бизнес-логика с помощью ФП Класс GroomFilter List suitableGrooms = new ArrayList(); for (groom in allGrooms) { if ( groomChecker .apply(groom)) suitableGrooms.add(groom); } return suitableGrooms; List filterGrooms(List allGrooms, Predicate groomChecker ) Передаём функцию как параметр
  • 28. Google collections package com.google.common.base; public interface Predicate <T> { { /** * Возвращает true или false для данного объекта */ boolean apply (T input); } http://bwinterberg.blogspot.com/2009/09/introduction-to-google-collections.html http://code.google.com/p/google-collections/
  • 29. Google collections package com.google.common.base; public class Predicates { static <T> Predicate<T> alwaysTrue (); static <T> Predicate<T> alwaysFalse (); static <T> Predicate<T> isNull () ; static <T> Predicate<T> notNull (); static <T> Predicate<T> not (Predicate<T> predicate); static <T> Predicate<T> and (Predicate<? super T>... components); … }
  • 30. Google collections package com.google.common.collect; public class Collections2 { static <E> Collection<E> filter ( Collection<E> unfiltered , Predicate<? super E> predicate ) static <F, T> Collection<T> transform ( Collection<F> fromCollection , Function<? super F, T> function ) }
  • 31. Бизнес-логика с помощью ФП Класс GroomFilter return Collections2.filter (allGrooms, groomChecker); List filterGrooms(List allGrooms, Predicate groomChecker ) Функция filterGrooms становится ещё проще
  • 32. Бизнес-логика с помощью ФП Клиент 1 List suitableGrooms grooms = GroomFilter.filterGrooms(…, new Predicate<Groom>() { public boolean apply(Groom groom) { return groom.getAge() > 23; } } ); Клиент 2 List suitableGrooms = GroomFilter.filterGrooms(…, Predicates.alwaysTrue() ); Closure – Объект, представляющий функцию Анонимные классы часто используются в качестве closures
  • 33. Применение ФП : Фильтры Дано : список имён женихов . Найти : все имена, начинающиеся на “Mr.” List gentlemen = new LinkedList(); for (Iterator it = groomsNames .iterator(); it.hasNext(); ) { String name = (String) it.next(); if (name != null && name.startsWith(“Mr.”)) { gentlemen .add(name); } } return gentlemen ; Императивное программирование:
  • 34. Применение ФП : Фильтры Функциональное программирование: import com.google.common.collect.Collections2; return Collections2 . filter( allGrooms, StringPredicates.startsWith( “Mr.” ) ) ; Дано : список имён женихов . Найти : все имена, начинающиеся на “Mr.”
  • 35. Применение ФП : Функции Дано : список женихов Найти : список имён женихов List groomsNames = new ArrayList(); for (Iterator it = allGrooms .iterator(); it.hasNext(); ) { Groom groom = (Groom) it.next(); groomsNames .add(groom.getName()); } return groomsNames ; Императивное программирование
  • 36. Применение ФП : Функции import com.google.common.collect.Collections2; return Collections2. transform( allGrooms , new Function<Groom, String> () { public String apply(Groom groom) { return groom.getName(); } } ) ; Функциональное программирование Дано : список женихов Найти : список имён женихов На первый взгляд, не столь красиво, но может быть вынесено в отдельный класс и многократно использовано!
  • 37. Google collections GC позволяет сделать и более элегантные конструкции boolean result = and( not( in(list1) ), in(list2), in(list3)).apply(&quot;1&quot;); Collection names = Joiner.on(&quot;; &quot;).useForNull(&quot;B000&quot;).join(filtered);
  • 38.