LAMBDA IN JAVA 8
MIKE PONOMARENKO
ТЕОРИЯ

    Что такое замыкание (Lambda Expressions, JSR 335)
    Изменения в языке
    Сопутствующие изменения




2                         Sigma Ukraine
JSR 335
EARLY DRAFT R3
ТЕОРИЯ - ЗАМЫКАНИЯ

    Lambda expression
    – Анонимный метод
    – Может обращаться к переменным в локальной области
    – Нет лишнего .class при компиляции
    (x, y) => { System.out.println("The sum of x and y equals " +
    (x+y) )
    () => {return outerValue;}




4                             Sigma Ukraine
ПРИМЕР

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

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

 5                                  Sigma Ukraine
ПРИМЕР


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




6                   Sigma Ukraine
ПРИМЕР


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



 7                 Sigma Ukraine
ПРИМЕР


String ref = "a";
Runnable r = new Runnable(){
      public void run(){
      System.out.println(ref);
    }
};
r.run();
System.out.println(ref);

 8                Sigma Ukraine
ПРИМЕР



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




 9                                Sigma Ukraine
ПРИМЕР



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




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

     Функциональный интерфейс
     – “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
ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮ



interface A{
       void doA();
}

interface B extends A{
      default void doB() {
            doA();
            doA();
       }
}
 12                     Sigma Ukraine
ТЕОРИЯ, МЕТОД ПО УМОЛЧАНИЮ



interface A{
       void doA();
      default void doB() {
             doA();
             doA();
       }
}




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

“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[]::new




14                                   Sigma Ukraine
ПРИМЕР


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




15                    Sigma Ukraine
ПРИМЕР

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
ПРИМЕР

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
JDK

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




18                            Sigma Ukraine
ТЕОРИЯ

  Добавляется в рантайм
  Множественное наследование поведения.
  Похоже на “C# extension methods”
  Наследование –
1. Суперкласс (“class wins”)
2. Более спецефичный интерфейс (“subtype wins”)
3. Делать вид что метод абстрактный
     1. Реализующий класс должен сделать выбор сам.
        A.super.m()




19                          Sigma Ukraine
JDK

interface Iterator<T> {
       boolean hasNext();
       T next();
       default void remove() {
               throw new UnsupportedOperationException();
       }
}




 20                       Sigma Ukraine
JDK

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




21                             Sigma Ukraine
JDK


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

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




  22                        Sigma Ukraine
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);
}




    23                              Sigma Ukraine
JDK

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




24                            Sigma Ukraine
Thank you for your attention!

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

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

Editor's Notes

  • #2 Hello and welcome to Sigma Ukraine!
  • #13 А нужен ли Б?
  • #14 Старый код работает, новый на старых классах тоже