Upload
alex-tumanoff
View
3.527
Download
5
Embed Size (px)
DESCRIPTION
"Lambda выражения и Java 8" by Михаил Пономаренко, Tech Lead, компания Sigma Ukraine
Citation preview
Что такое замыкание (Lambda Expressions, JSR 335)
Изменения в языке
Сопутствующие изменения
Sigma Ukraine 2
ТЕОРИЯ
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 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;
}
Добавляется в рантайм
Множественное наследование поведения.
Похоже на “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();}
}
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);}