25
LAMBDA IN JAVA 8 MIKE PONOMARENKO

Lambda выражения и Java 8

Embed Size (px)

DESCRIPTION

"Lambda выражения и Java 8" by Михаил Пономаренко, Tech Lead, компания Sigma Ukraine

Citation preview

LAMBDA IN JAVA 8MIKE PONOMARENKO

Что такое замыкание (Lambda Expressions, JSR 335)

Изменения в языке

Сопутствующие изменения

Sigma Ukraine 2

ТЕОРИЯ

JSR 335EARLY DRAFT R3

Lambda expression– Анонимный метод– Может обращаться к переменным в локальной области– Нет лишнего .class при компиляции

(x, y) => { System.out.println("The sum of x and y equals " + (x+y) )

() => {return outerValue;}

Sigma Ukraine 4

ТЕОРИЯ - ЗАМЫКАНИЯ

ПРИМЕР

Sigma Ukraine 5

{String ref = "a";Runnable r = () -> {ref = "b";};r.run();System.out.println(ref);}

error: local variables referenced from a lambda expression must be final or effectively final

ПРИМЕР

Sigma Ukraine 6

{Runnable r = ()->{System.out.println("hello");};(new Thread(r)).start();}

ПРИМЕР

Sigma Ukraine 7

{String ref = "a";Runnable r = () -> {System.out.println(ref);};r.run();System.out.println(ref);}

ПРИМЕР

Sigma Ukraine 8

String ref = "a";Runnable r = new Runnable(){

public void run(){ System.out.println(ref);

}};r.run();System.out.println(ref);

ПРИМЕР

Sigma Ukraine 9

{List<String> strings = new LinkedList<String>();Collections.sort(strings, (String a,String b) -> { return -(a.compareTo(b)); });}

ПРИМЕР

Sigma Ukraine 10

{List<String> strings = new LinkedList<String>();Collections.sort(strings, (a, b) -> -(a.compareTo(b)));}

Функциональный интерфейс– “A functional interface is an interface that has just one abstract

method, and thus represents a single function contract. (In some cases, this "single" method may take the form of multiple abstract methods with override-equivalent signatures inherited from superinterfaces; in this case, the inherited methods logically represent a single method.)” - JSR

Метод по умолчанию

Ссылка на метод

Sigma Ukraine 11

ТЕРИЯ, ИЗМЕНЕНИЯ В ЯЗЫКЕ

ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮ

Sigma Ukraine 12

interface A{void doA();

}

interface B extends A{ default void doB() {

doA(); doA();

}}

ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮ

Sigma Ukraine 13

interface A{void doA();

default void doB() { doA();

doA();}

}

System::getProperty

"abc"::length

String::length

super::toString

ArrayList::new

int[]::new

Sigma Ukraine 14

ТЕОРИЯ, ССЫЛКА НА МЕТОД

“A method reference is used to refer to a method without invoking it; a constructor reference is similarly used to refer to a constructor without creating a new instance of the named class or array type.” - JSR

Sigma Ukraine 15

ПРИМЕР

Collection<String> c = Arrays.asList("A","B","CD");System.out.println(sum(c,String::length));

Sigma Ukraine 16

ПРИМЕР

interface Code<T,R>{R exec(T input);

}

public static <T,R extends Number> long sum(Collection<T> c ,Code<T,R> cd){long rz = 0;for(T t : c){

R v = cd.exec(t);if(v!=null) {

rz+=v.longValue();}

}return rz;

}

Sigma Ukraine 17

ПРИМЕР

import java.util.function.*;

public static <T,R extends Number> long sum(Collection<T> c , Function<T,R> cd){

long rz = 0;for(T t : c){

R v = cd.apply(t);if(v!=null) {

rz+=v.longValue();}

}return rz;

}

System.out.println(c.stream().map(String::length).sum());

Sigma Ukraine 18

JDK

Добавляется в рантайм

Множественное наследование поведения.

Похоже на “C# extension methods”

Наследование –

1. Суперкласс (“class wins”)

2. Более спецефичный интерфейс (“subtype wins”)

3. Делать вид что метод абстрактный1. Реализующий класс должен сделать выбор сам.

A.super.m()

Sigma Ukraine 19

ТЕОРИЯ

Sigma Ukraine 20

JDK

interface Iterator<T> {boolean hasNext();T next();default void remove() {

throw new UnsupportedOperationException();}

}

interface Collection– forEach– removeIf(Predicate)– stream()– parallelStream()

Sigma Ukraine 21

JDK

Sigma Ukraine 22

JDK

default Stream<E> stream() { return Streams.stream(() -> Streams.spliterator(iterator(), size(), Spliterator.SIZED), Spliterator.SIZED);}

default Stream<E> parallelStream() { return stream().parallel();}

Sigma Ukraine 23

JDK

public interface Stream<T> extends BaseStream<T, Stream<T>> { Stream<T> filter(Predicate<? super T> predicate); <R> Stream<R> map(Function<? super T, ? extends R> mapper); Stream<T> sorted(); Optional<T> reduce(BinaryOperator<T> reducer);

default Optional<T> max(Comparator<? super T> comparator) { return reduce(Comparators.greaterOf(comparator)); }

boolean anyMatch(Predicate<? super T> predicate);}

System.out.println(c.stream().map(String::length).sum());

Sigma Ukraine 24

JDK

Thank you for your attention!