Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

5,179 views

Published on

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

Published in: Technology
  • Login to see the comments

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

  1. 1. LAMBDA IN JAVA 8MIKE PONOMARENKO
  2. 2. ТЕОРИЯ Что такое замыкание (Lambda Expressions, JSR 335) Изменения в языке Сопутствующие изменения2 Sigma Ukraine
  3. 3. JSR 335EARLY DRAFT R3
  4. 4. ТЕОРИЯ - ЗАМЫКАНИЯ Lambda expression – Анонимный метод – Может обращаться к переменным в локальной области – Нет лишнего .class при компиляции (x, y) => { System.out.println("The sum of x and y equals " + (x+y) ) () => {return outerValue;}4 Sigma Ukraine
  5. 5. ПРИМЕРerror: local variables referenced from a lambdaexpression must be final or effectively final{String ref = "a";Runnable r = () -> {ref = "b";};r.run();System.out.println(ref);} 5 Sigma Ukraine
  6. 6. ПРИМЕР{Runnable r = ()->{System.out.println("hello");};(new Thread(r)).start();}6 Sigma Ukraine
  7. 7. ПРИМЕР{String ref = "a";Runnable r = () -> {System.out.println(ref);};r.run();System.out.println(ref);} 7 Sigma Ukraine
  8. 8. ПРИМЕРString ref = "a";Runnable r = new Runnable(){ public void run(){ System.out.println(ref); }};r.run();System.out.println(ref); 8 Sigma Ukraine
  9. 9. ПРИМЕР{List<String> strings = new LinkedList<String>();Collections.sort(strings, (String a,String b) -> { return -(a.compareTo(b)); });} 9 Sigma Ukraine
  10. 10. ПРИМЕР{List<String> strings = new LinkedList<String>();Collections.sort(strings, (a, b) -> -(a.compareTo(b)));} 10 Sigma Ukraine
  11. 11. ТЕРИЯ, ИЗМЕНЕНИЯ В ЯЗЫКЕ Функциональный интерфейс – “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 Метод по умолчанию Ссылка на метод11 Sigma Ukraine
  12. 12. ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮinterface A{ void doA();}interface B extends A{ default void doB() { doA(); doA(); }} 12 Sigma Ukraine
  13. 13. ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮinterface A{ void doA(); default void doB() { doA(); doA(); }} 13 Sigma Ukraine
  14. 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 System::getProperty "abc"::length String::length super::toString ArrayList::new int[]::new14 Sigma Ukraine
  15. 15. ПРИМЕРCollection<String> c = Arrays.asList("A","B","CD");System.out.println(sum(c,String::length));15 Sigma Ukraine
  16. 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;} 16 Sigma Ukraine
  17. 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;} 17 Sigma Ukraine
  18. 18. JDK System.out.println(c.stream().map(String::length).sum());18 Sigma Ukraine
  19. 19. ТЕОРИЯ Добавляется в рантайм Множественное наследование поведения. Похоже на “C# extension methods” Наследование –1. Суперкласс (“class wins”)2. Более спецефичный интерфейс (“subtype wins”)3. Делать вид что метод абстрактный 1. Реализующий класс должен сделать выбор сам. A.super.m()19 Sigma Ukraine
  20. 20. JDKinterface Iterator<T> { boolean hasNext(); T next(); default void remove() { throw new UnsupportedOperationException(); }} 20 Sigma Ukraine
  21. 21. JDK interface Collection – forEach – removeIf(Predicate) – stream() – parallelStream()21 Sigma Ukraine
  22. 22. JDKdefault Stream<E> stream() { return Streams.stream(() -> Streams.spliterator(iterator(), size(), Spliterator.SIZED), Spliterator.SIZED);}default Stream<E> parallelStream() { return stream().parallel();} 22 Sigma Ukraine
  23. 23. JDKpublic 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);} 23 Sigma Ukraine
  24. 24. JDK System.out.println(c.stream().map(String::length).sum());24 Sigma Ukraine
  25. 25. Thank you for your attention!

×