gdg almaty. Функциональное программирование в java 8

37
Sayat Satybaldiyev Software Dev. @ Green Apple Twitter: Sayat_Stb Google Developers Group Almaty

Upload: madina-kamzina

Post on 06-Jul-2015

224 views

Category:

Education


6 download

DESCRIPTION

О функциональном программировании (ФП), преимуществах его использования и о том, какие возможности для него добавили в новом релизе Java. Слушатели также узнают, почему уже сейчас стоит начать изучать ФП. Митап состоялся ->> https://plus.google.com/u/0/b/100893943920756626864/events/c0b2b1ih9ft0opcdnmdgp3453rk

TRANSCRIPT

Page 1: Gdg almaty. Функциональное программирование в Java 8

Sayat SatybaldiyevSoftware Dev. @ Green Apple

Twitter: Sayat_Stb

Google Developers Group Almaty

Page 2: Gdg almaty. Функциональное программирование в Java 8

Google Developers GroupAlmaty

• Некоммерческое сообщество, в основе которого лежит обмен опытом и знаниями технологии Google для разработчиков - Android, Google Maps, App Engine, Chrome, Web Toolkit, Google Plus и другие.

• Среди нас есть программисты, архитекторы, дизайнеры, IT-менеджеры, студенты и руководители. И мы всегда рады новым знакомствам :)

Page 3: Gdg almaty. Функциональное программирование в Java 8

Спонсор фуршета

Page 4: Gdg almaty. Функциональное программирование в Java 8
Page 5: Gdg almaty. Функциональное программирование в Java 8

История

Lisp, Schema, Haskell

Page 6: Gdg almaty. Функциональное программирование в Java 8

Как можно выбрать все зеленые яблоки из коллекции красных, желтых и зеленых яблок?

Page 7: Gdg almaty. Функциональное программирование в Java 8

Functional vs Imperative

List<Apple> result = new ArrayList<>();

for(Apple apple: input){

if(apple.getColor.equals("green")){

result.add(apple);

}

}

return result;

Page 8: Gdg almaty. Функциональное программирование в Java 8

Functional vs Imperative

filterApples(input,

(Apple a) -> { a.getColor().equals("green")}

)

Page 9: Gdg almaty. Функциональное программирование в Java 8

Принципы ФП

• Higher Order Functionspass, create, return

• Side Effects Freef(x, y) = x^2 + y ^2

• Immutabilityeasy to reason, multithreaded

Page 10: Gdg almaty. Функциональное программирование в Java 8

Common FP operations

map

Page 11: Gdg almaty. Функциональное программирование в Java 8

Common FP operations

filter

Page 12: Gdg almaty. Функциональное программирование в Java 8

Common FP operations

reduce

Page 13: Gdg almaty. Функциональное программирование в Java 8

Java 8 Lambda Project

The first ever big release since 1.5!

aka Functional Style

Page 14: Gdg almaty. Функциональное программирование в Java 8

First Lambdas

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("button clicked")}

});

Page 15: Gdg almaty. Функциональное программирование в Java 8

First Lambdas

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("button clicked")}

});

button.addActionListener(event -> System.out.println("button clicked"));

Page 16: Gdg almaty. Функциональное программирование в Java 8

Синтаксис Lambda Выражений

• Lambda - anonymous function(arg1, arg2...) -> { body }

(int x, int y) -> x + y(x, y) -> x + y() -> System.out.println(“Hello World”)

Page 17: Gdg almaty. Функциональное программирование в Java 8

Functional Interface

T => Boolean@FunctionalInterfacepublic interface Predicate<T>{

boolean test(T t)

}T => void@FunctionalInterfacepublic interface Consumer<T>{

void accept(T t)}T => R@FunctionalInterfacepublic interface Function<T, R>{

R apply(T t)}

Def: A functional interface is an interface with a single abstract method that is used as the type of a lambda expression.

Page 18: Gdg almaty. Функциональное программирование в Java 8

Functional Interface

Represents a function that accepts one argument and produces a result.T => R@FunctionalInterfacepublic interface Function<T, R>{

R apply(T t)}

Function<Apple, String> = (Apple a ) -> a.toString()

Page 19: Gdg almaty. Функциональное программирование в Java 8

Functional Interface

Represents a predicate (boolean-valued function) of one argument. - Filter

T => Boolean@FunctionalInterface

public interface Predicate<T>{boolean test(T t)

}

Predicate<Integer> atLeast5 = ( x ) -> x > 5;

Page 20: Gdg almaty. Функциональное программирование в Java 8

Functional Interface

Represents an operation that accepts a single input argument and returns no result.

T => void@FunctionalInterfacepublic interface Consumer<T>{

void accept(T t)}

Consumer<Apple> = (Apple a) -> System.out.println(a.toString())

Page 21: Gdg almaty. Функциональное программирование в Java 8

Stream APIs

Page 22: Gdg almaty. Функциональное программирование в Java 8

Streams

• No Storage• Lazy Evaluations• Infinite/Finite Stream• Single Usage• Ordered/Unordered• Parallel/Sequential

Page 23: Gdg almaty. Функциональное программирование в Java 8

Streams

Declarative Style

what to do NOT howList<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList

.stream()

.filter(s -> s.startsWith("c"))

.map(String::toUpperCase)

.sorted()

.forEach(System.out::println);

Page 24: Gdg almaty. Функциональное программирование в Java 8

Streams

Pipes-and-filter Style API

Page 25: Gdg almaty. Функциональное программирование в Java 8

Creating Stream API

Arrays.stream()

Stream<Integer> = Stream.of(1, 2, 3)

Infinite

Stream.iterate(0, n-> n + 10)

ex: with limit - fixed size

Page 26: Gdg almaty. Функциональное программирование в Java 8

Stream Operatons

filter(Predicate<T>)

map(Function<R, T>)

sorted(Comparator<T>)

limit(long maxSize)

distinct()

Page 27: Gdg almaty. Функциональное программирование в Java 8

Terminal Stream Operation

Terminal

sum()

max()/min()

average()

forEach()

collect()

Page 28: Gdg almaty. Функциональное программирование в Java 8

Parallel Stream

Page 29: Gdg almaty. Функциональное программирование в Java 8

Количество зеленых яблок в колекции?

int count = 0;for (Apple apple : allApples) {

if (apple.equals("green")) { count++;

} } return count;

Page 30: Gdg almaty. Функциональное программирование в Java 8

Количество зеленых яблок в колекции?

int count = 0;Iterator<Apple> iterator = allApples.iterator(); while(iterator.hasNext()) {

Apple apple = iterator.next(); if (apple.equals("green")) {

count++; }

}

Page 31: Gdg almaty. Функциональное программирование в Java 8

Parallel Streams

public int parallelArraySum() { return albums.parallelStream()

.mapToInt((Track tr) -> tr.getLength) .sum();

} ● Fork and Join Framework● NOT keep order of stream

Page 32: Gdg almaty. Функциональное программирование в Java 8

Performance

private int addIntegers(List<Integer> values) { return values.parallelStream()

.mapToInt(i -> i) .sum();

}

Page 33: Gdg almaty. Функциональное программирование в Java 8

Performance

Page 34: Gdg almaty. Функциональное программирование в Java 8

Performance

Data size

Source data structure

# cores

Page 35: Gdg almaty. Функциональное программирование в Java 8

FP in Java 8

1. FP(ish) programming

2. Declarative

3. Working with Data Processing

Page 36: Gdg almaty. Функциональное программирование в Java 8

Спасибо за внимание

Google Developers Group Almaty

www.GDGalmaty.org

Page 37: Gdg almaty. Функциональное программирование в Java 8

Optional