76
JDK 8: Я, Лямбда Сергей Куксенко [email protected], @kuksenk0

JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко [email protected], @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

JDK 8: Я, Лямбда

Сергей Куксенко[email protected], @kuksenk0

Page 2: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

The following is intended to outline our generalproduct direction. It is intended for informationpurposes only, and may not be incorporated into anycontract. It is not a commitment to deliver anymaterial, code, or functionality, and should not berelied upon in making purchasing decisions. Thedevelopment, release, and timing of any features orfunctionality described for Oracle’s products remainsat the sole discretion of Oracle.

Slide 2/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 3: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение

Slide 3/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 4: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: про доклады

JDK8: Я, лямбда: (← вы здесь)доклад про лямбды как самостоятельнуюязыковую фичу

lambda expressionsmethod references

JDK8: Молот лямбд:доклад про то, что лямбды ещё изменили вJava и JDK

more 𝜆-accepting methods in JDKdefault methods in interfacesstatic methods in interfacesstreams (a.k.a. bulk collection operations)

Slide 4/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 5: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: вопросы

Что?

Как?Зачем?Почему?Почему бы не?

Slide 5/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 6: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: вопросы

Что?Как?

Зачем?Почему?Почему бы не?

Slide 5/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 7: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: вопросы

Что?Как?Зачем?

Почему?Почему бы не?

Slide 5/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 8: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: вопросы

Что?Как?Зачем?Почему?

Почему бы не?

Slide 5/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 9: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: вопросы

Что?Как?Зачем?Почему?Почему бы не?

Slide 5/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 10: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Введение: 𝜆 samples code

https://github.com/kuksenko/jdk8-lambda-samples

Slide 6/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 11: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Lambda

Slide 7/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 12: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Lambda - ?

Slide 8/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 13: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Lambda:анонимная функция

Slide 9/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 14: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

𝜆 : JDK N, where N < 8

new Comparator <Integer >() {

@Overridepublic int compare(Integer x, Integer y) {

return (x < y) ? -1: (x > y) ? 1 : 0;

}

};

Slide 10/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 15: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

𝜆 : JDK N, where N > 8

(x, y) -> (x < y) ? -1: (x > y) ? 1 : 0

Slide 11/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 16: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Lambda:

анонимная функциявыражение, описывающее анонимнуюфункцию

Slide 12/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 17: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

𝜆 : functional interface

Функциональный интерфейсИнтерфейс, содержащий единственныйабстрактный метод.

a.k.a. SAM (Single Abstract Method)e.g.

java.lang.Runnablejava.util.Comparatorjava.awt.event.ActionListener

Slide 13/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 18: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Lambda:

анонимная функциявыражение, описывающее анонимнуюфункциювыражение, описывающее анонимнуюфункцию, результатом исполнения которогоявляется некоторый объект, реализующийтребуемый функциональный интерфейсинтерфейс

Slide 14/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 19: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Lambda:

анонимная функциявыражение, описывающее анонимнуюфункциювыражение, описывающее анонимнуюфункцию, результатом исполнения которогоявляется объект неизвестной природы,реализующий требуемый функциональныйинтерфейс

Slide 15/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 20: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

𝜆 : examples

// don’t try this at homeComparator <Integer > cmp = (x, y) -> x - y;

// BinaryOperator <T> - T apply(T t, T u)BinaryOperator <Integer > sub =

(x, y) -> x - y;

// BiFunction <T, U, R> - R apply(T t, U u)BiFunction <Integer ,Integer ,Integer > biSub =

(x, y) -> x - y;

Slide 16/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 21: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: все вокруг →

Comparator <Integer > cmp =

(x, y) ->(x < y) ? -1 : (x > y) ? 1 : 0;

Slide 17/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 22: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: явное указание типов

Comparator <Integer > cmp =

(Integer x, Integer y) ->(x < y) ? -1 : (x > y) ? 1 : 0;

Slide 18/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 23: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: без аргументов

// Supplier <T> - T get();

Supplier <Integer > ultimateAnswerFactory =

() -> 42;

Slide 19/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 24: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: с единственным аргументом

// Function <T, R> - R apply(T t);

Function <String , Integer > f0 =

(String s) -> Integer.parseInt(s);

Function <String , Integer > f1 =

(s) -> Integer.parseInt(s);

Function <String , Integer > f2 =

s -> Integer.parseInt(s);

Slide 20/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 25: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: все ли тут правильно?

Comparator <Integer > cmp =

(x, y) -> (x < y) ? -1: (x == y) ? 0 : 1;

Comparator<Integer> rightCmp = (a, b) -> {int x = a;int y = b;return (x < y) ? -1: (x == y) ? 0 : 1;};

Slide 21/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 26: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: все ли тут правильно?

Comparator <Integer > cmp =

(x, y) -> (x < y) ? -1: (x == y) ? 0 : 1;

Comparator<Integer> rightCmp = (a, b) -> {int x = a;int y = b;return (x < y) ? -1: (x == y) ? 0 : 1;};

Slide 22/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 27: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: блок как тело

Comparator <Integer > cmp =

(x, y) -> (x < y) ? -1: (x == y) ? 0 : 1;

Comparator <Integer > rightCmp = (a, b) -> {int x = a;int y = b;return (x < y) ? -1

: (x == y) ? 0 : 1;};

Slide 23/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 28: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: блок как тело

// Supplier <T> - T get();

Supplier <Integer > deepThought =

() -> {long toThinkInMillis =

TimeUnit.DAYS.toMillis (2737500000L);Thread.sleep(toThinkInMillis );return 42;

};

Slide 24/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 29: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: lambda без результата

// Consumer <T> - void accept(T t);

Consumer <String > c =s -> { System.out.println(s);};

Arrays.asList("Foo", "Bar"). forEach(c);

Arrays.asList("Foo", "Bar", "Baz").forEach(s -> System.out.println(s));

Slide 25/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 30: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: variable hiding запрещен!

public void foo() {int x = 42;

Comparator <Integer > cmp =(x, y) -> (x < y) ? -1

: (x > y) ? 1 : 0;...

Compile Error!

Slide 26/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 31: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

syntax: variable hiding запрещен!

public void foo() {int x = 42;

Comparator <Integer > cmp = (a, b) -> {int x = a;int y = b;return (x < y) ? -1

: (x == y) ? 0 : 1;};...

Compile Error!

Slide 27/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 32: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

usage: Где?

оператор присваивания(правая часть)

e.g. FI f = () -> 42;

Slide 28/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 33: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

usage: Где?

return

O

e.g. return () -> 42;

Slide 29/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 34: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

usage: Где?

аргументметода/конструктора

e.g foo(1 , () -> 42)

Slide 30/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 35: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

usage: Где?

инициализатор массива

O

e.g. FI[] fis = { () -> 41, () -> 42 };

Slide 31/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 36: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

usage: Где?

cast

O

e.g. (FI)() -> 42

Slide 32/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 37: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: in anonymous classes

public Comparator <Integer > makeComparator (){final int less = -1;final int equal = 0;final int greater = 1;

return new Comparator <Integer >(){@Overridepublic int compare(Integer x, Integer y){

return (x < y) ? less: (x > y) ? greater

: equal;}

};}

Slide 33/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 38: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: in lambdas

public Comparator <Integer > makeComparator (){int less = -1;int equal = 0;int greater = 1;

return (x, y) ->(x < y) ? less

: (x > y) ? greater: equal;

}OOOO

Slide 34/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 39: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: effective final

lambda может использовать любые внешниепеременные, если они являются effective final

Effective finalЛокальная переменная, не меняющая своегозначения

a.k.a. final переменная «de facto»

Slide 35/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 40: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: effective final

public void foo() {int cnt = 0;

Supplier <Integer > counter = () -> cnt++;...

Compile Error!

Slide 36/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 41: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: bonusEffective final in anonymous classespublic Comparator <Integer > makeComparator (){

int less = -1;int equal = 0;int greater = 1;

return new Comparator <Integer >(){@Overridepublic int compare(Integer x, Integer y){

return (x < y) ? less: (x > y) ? greater

: equal;}

};}

Slide 37/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 42: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: рекурсивные лямбды

public class Fibonacci {// IntUnaryOperator - int applyAsInt(int)

IntUnaryOperator fib_instance =(n) -> (n < 2) ? n :

fib_instance.applyAsInt(n - 1) +fib_instance.applyAsInt(n - 2);

static IntUnaryOperator fib_static =(n) -> (n < 2) ? n :

fib_static.applyAsInt(n - 1) +fib_static.applyAsInt(n - 2);

Slide 38/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 43: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

capture: рекурсивные лямбды

public IntUnaryOperator makeLocalFib () {IntUnaryOperator fib_local =

(n) -> (n < 2) ? n :fib_local.applyAsInt(n - 1) +fib_local.applyAsInt(n - 2);

return fib_local;}

Compile Error!

Slide 39/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 44: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Method Reference

Slide 40/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 45: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

example: good?

//Integer:// public static int compare(int x, int y)

Comparator <Integer > cmp =

(x, y) -> (x < y) ? -1: (x > y) ? 1 : 0;

Slide 41/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 46: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

example: do not reinvent the wheel

// Integer:// public static int compare(int x, int y)

Comparator <Integer > cmp =

(x, y) -> Integer.compare(x, y);: (x > y) ? 1 : 0;

Slide 42/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 47: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: example

// Integer:// public static int compare(int x, int y)

Comparator <Integer > cmp = Integer::compare;

(x, y) -> Integer.compare(x, y);: (x > y) ? 1 : 0;

Slide 43/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 48: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: bounded

// PrintStream - public void println(String s)

//Consumer <T> - void accept(T t);

Arrays.asList("Foo", "Bar", "Baz").forEach(System.out::println);

Slide 44/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 49: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: bounded

// Predicate <T> - boolean test(T t);

Predicate <String > newMatcher(String pattern){

return pattern:: equalsIgnoreCase;}

assertTrue(newMatcher("true").test("TruE"))

assertTrue(newMatcher("false").test("FalsE"))

assertFalse(newMatcher("true").test("FalsE"))

Slide 45/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 50: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: bounded

// Predicate <T> - boolean test(T t);

Predicate <String > isTrue ="true":: equalsIgnoreCase;

assertTrue(isTrue.test("TruE"))

assertFalse(isTrue.test("FalsE"))

Slide 46/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 51: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: unbounded

// Comparator <T>:// int compare(T o1, T o2);

// Integer:// int compareTo(Integer anotherInteger)

Comparator <Integer > cmp = Integer :: compareTo;

Slide 47/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 52: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: example

// Function <T, R> - R apply(T t);

Function <String , Integer > f0 =Integer :: parseInt;

// Integer - public Integer(String s)

Function<String, Integer> f1 = Integer::new;

Slide 48/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 53: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: to constructor

// Function <T, R> - R apply(T t);

Function <String , Integer > f0 =Integer :: parseInt;

// Integer - public Integer(String s)

Function <String , Integer > f1 = Integer ::new;

Slide 49/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 54: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: to constructor

public class Counter {private int c = 0;public Counter () { this (0); }public Counter(int c) { this.c = c; }public int inc() { return ++c; }public int get() { return c; }

}

Supplier <Counter > f = Counter ::new;assertEquals (0, f.get ().get ());assertEquals (1, f.get ().inc ());

Slide 50/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 55: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

method reference: to constructor

public class Counter {private int c = 0;public Counter () { this (0); }public Counter(int c) { this.c = c; }public int inc() { return ++c; }public int get() { return c; }

}

Function <Integer , Counter > f = Counter ::new;assertEquals (1, f.apply (1). get ());assertEquals (42, f.apply (42). get ());

Slide 51/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 56: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Serialization

Slide 52/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 57: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

example: unsigned int set

NavigableSet <Integer > set = new TreeSet <>((x, y) -> Integer.compareUnsigned(x, y)

);Oset.addAll(Arrays.asList (-100, 0, 100));OassertEquals (0, set.first ());OassertEquals (-100, set.last ());O

Slide 53/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 58: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

example: unsigned int set

NavigableSet <Integer > set = new TreeSet <>((x, y) -> Integer.compareUnsigned(x, y)

);

try {ObjectOutputStream stream = ......stream.writeObject(set);

} catch (NotSerializableException e) {we are here :(

} ...

Slide 54/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 59: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

serialization: ЧТО ДЕЛАТЬ?

NavigableSet <Integer > set = new TreeSet <>((x, y) -> Integer.compareUnsigned(x, y)

);

try {ObjectOutputStream stream = ......stream.writeObject(set);

} catch (NotSerializableException e) {we are here :(

} ...

Slide 55/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 60: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

serialization: «type intersection»

NavigableSet <Integer > set = new TreeSet <>((Comparator<Integer> & Serializable)(x, y) -> Integer.compareUnsigned(x, y)

);

try {ObjectOutputStream stream = ......stream.writeObject(set);

} catch (NotSerializableException e) {we are not here :)

} ...

Slide 56/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 61: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

serialization: marker interface

Маркер-интерфейсИнтерфейс, не содержащий абстрактных методов.

a.k.a. ZAM (Zero Abstract Methods)

type intersection(𝑆𝐴𝑀 & 𝑍𝐴𝑀0 & 𝑍𝐴𝑀1 & ... & 𝑍𝐴𝑀𝑘)

Slide 57/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 62: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

serialization: marker interface

Маркер-интерфейсИнтерфейс, не содержащий абстрактных методов.

a.k.a. ZAM (Zero Abstract Methods)

type intersection(𝑆𝐴𝑀 & 𝑍𝐴𝑀0 & 𝑍𝐴𝑀1 & ... & 𝑍𝐴𝑀𝑘)

Slide 57/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 63: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

serialization: method reference

NavigableSet <Integer > set = new TreeSet <>((Comparator<Integer> & Serializable)Integer :: compareUnsigned

);

try {ObjectOutputStream stream = ......stream.writeObject(set);

} catch (NotSerializableException e) {we are not here :)

} ...

Slide 58/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 64: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Детали реализации

Slide 59/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 65: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 60/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 66: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 61/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 67: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 62/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 68: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 63/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 69: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 64/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 70: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 65/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 71: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 66/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 72: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 67/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 73: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 68/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 74: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Slide 69/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 75: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Ресурсы

Slide 70/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.

Page 76: JDK 8: Я, Лямбда · 2013. 5. 20. · JDK8:Я,Лямбда Сергей Куксенко sergey.kuksenko@oracle.com, @kuksenk0. Thefollowingisintendedtooutlineourgeneral productdirection

Ресурсы: Полезные ссылки

Project Lambda:http://openjdk.java.net/projects/lambda/

Binary builds:http://jdk8.java.net/lambda

Mailing list:[email protected]

Talk samples:https://github.com/kuksenko/jdk8-lambda-samples

Slide 71/71. Copyright c○ 2013, Oracle and/or its affiliates. All rights reserved.