SlideShare a Scribd company logo
1 of 26
Download to read offline
AKADEMIA JUG
WYRAZENIA LAMBDA I STRUMIENIE

05.04.2017
Krzysztof Pawłowski ◇@krzychpawlowski
ƛ
CZYM JEST WYRAŻENIE LAMBDA?
➤ sparametryzowany blok kodu
➤ lista formalnych parametrów i ciało funkcji
➤ “anonimowa funkcja”
Przykłady:
() -> 1
x -> x * x
(x, y) -> (x + y)
(String s1, String s2) -> (s1.equals(s2))
(String s) -> System.out.println(s)
PO CO NAM WYRAŻENIA LAMBDA?
➤ Wsparcie dla kolekcji - łatwiejsze iterowanie, filtrowanie,
wyciąganie danych
➤ Jasne i zwięzłe implementowanie interfejsu funkcyjnego
➤ Zwiększenie wydajności w środowiskach wielordzeniowych
ITEROWANIE ZEWNĘTRZNE VS ITEROWANIE WEWNĘTRZNE
➤ Iterowanie zewnętrzne



List<Integer> numbers = Arrays.asList(1, 2, 3, 4);

for (int number : numbers) {

System.out.println(number);

}

➤ Iterowanie wewnętrzne



List<Integer> numbers = Arrays.asList(1, 2, 3, 4);

numbers.forEach(value -> System.out.println(value));
INTERFEJS FUNKCYJNY VS WYRAŻENIE LAMBDA
➤ Interfejs funkcyjny

public interface ActionListener extends EventListener {

public void actionPerformed(ActionEvent e);

}



public class ListenerTest {

public static void main(String[] args) {

JButton testButton = new JButton(“Test Button");

testButton.addActionListener(new ActionListener() {

@Override 

public void actionPerformed(ActionEvent e) {

System.out.println(

“Click Detected by Anon Class");

}

});

}

}
INTERFEJS FUNKCYJNY VS WYRAŻENIE LAMBDA
➤ Wyrażenie lambda



public class ListenerTest {

public static void main(String[] args) {

JButton testButton = new JButton("Test␣Button");

testButton.addActionListener(e -> 

System.out.println("Click␣Detected␣by␣Anon␣Class"));

}

}
JAKIEGO TYPU MOGĄ BYĆ WYRAŻENIA LAMBDA?
➤ Interfejsy z pakietu java.util.function
➤ Predicate<T>
➤ Consumer<T>
➤ Function<T, R>
➤ Supplier<T>
➤ (…)
➤ więcej pod adresem: http://docs.oracle.com/javase/8/ 

docs/api/java/util/function/package-summary.html
➤ Zdefiniowany przez nas interfejs funkcyjny
PREDICATE<T>
public interface Predicate<T> {

default Predicate<T> and(Predicate<? super T> other);

static <T> Predicate<T> isEqual(Object targetRef);

default Predicate<T> negate();

default Predicate<T> or(Predicate<? super T> other);

boolean test(T t);

}
Przykład:
Predicate <String> stringsLongerThan10 = 

(String s) -> s.length() > 10;
boolean isLongerThan10 = 

stringsLongerThan10.test(‘‘Ala ma kota.’’)
CONSUMER<T>
public interface Consumer<T> {

default Consumer<T> andThen(Consumer<? super T> after);

void accept(T t);

}
Przykład:
Consumer <String> printToStdOut =

(String s) -> System.out.print(s);
printToStdOut.accept(“Hello World!”);
FUNCTION<T, R>
public interface Function<T, R> {

default Function<T, R> andThen(Function<? super T, 

? extends R> after);

default Function<T, R> compose(Function<? super T, 

? extends R> before);

static Function<T, T> identity();

R apply(T t);

}
Przykład:
Function <String, Integer > stringLength = 

(String s) -> s.length();
int strLen = stringLength.apply(“Ala ma kota.”);
SUPPLIER<T,>
public interface Supplier<T> {

T get();

}
Przykład:
Supplier <String > stringSupplier =

() -> new String(“Ala ma kota");
String s = stringSupplier.get();
“Talk is cheap. Show me the code.
-Linus Torvalds
PRZEKAZYWANIE METOD
➤ Za pomocą wyrażeń lambda tworzyliśmy funkcje anonimowe
➤ Jako parametry funkcji możemy przekazywać nazwane
metody:
➤ statyczne - NazwaKlasy::nazwaStatycznejMetody
➤ instancji klas - nazwaObiektu::nazwaMetody lub
NazwaKlasy::nazwaMetody
➤ konstruktor - NazwaKlasy::new
Przykład:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.forEach(System.out::println);
METODY DOMYŚLNE
➤ Wprowadzone, aby do Collections API móc wprowadzić
Streams API.
➤ Pozwalają rozszerzać interfejsy o domyślną implementację
metod z zachowaniem wstecznej kompatybilności.
➤ Mogą być dodane do każdego interfejsu - wtedy klasa
implementująca ten interfejs, jeśli nie nadpisze tej metody,
odziedziczy domyślną implementację tej metody.
METODY DOMYŚLNE - PROBLEM DIAMENTU
interface Foo {
default void talk() {
System.out.println("Foo!"); 

}
}
interface Bar {
default void talk() {
System.out.println("Bar!"); 

}
}
public class FooBar implements Foo, Bar {
// ???
}
METODY DOMYŚLNE - PROBLEM DIAMENTU
interface Foo {
default void talk() {
System.out.println("Foo!"); 

}
}
interface Bar {
default void talk() {
System.out.println("Bar!"); 

}
}
public class FooBar implements Foo, Bar {
public void talk() { Foo.super.talk(); }
}
CZYM SĄ STRUMIENIE W JAVIE 8?
➤ Klasy z pakietu java.util.stream.
➤ Wspierają operacje funkcyjne na sekwencjach elementów
(strumieniach):
➤ redukcje (ang. reduce) – suma, średnia, min itd.,
➤ odwzorowania (ang. map), filtrowanie.
➤ Wspierają zrównoleglanie operacji.
➤ Są zintegrowane z Collections API.
KOLEKCJE VS STRUMIENIE
➤ Strumienie w przeciwieństwie do kolekcji:
➤ nie przechowują elementów,
➤ mają naturę funkcyjną (źródłowa kolekcja nie jest
modyfikowana),
➤ stosują leniwe wyliczanie,
➤ mogą być nieograniczone,
➤ mogą być odwiedzone tylko raz w ich cyklu życia (jak
iterator).
OPERACJE NA STRUMIENIACH
➤ Operacje na strumieniach dzielimy na
➤ pośrednie (ang. intermediate):
➤ jako wynik dają nowy strumień,
➤ są wyliczane leniwie,
➤ mogą przechowywać stan (np. distinct, sorted) bądź nie
przechowywać stanu (np. filter, map),
➤ końcowe (ang. terminal):
➤ przechodzą przez strumień w celu obliczenia wyniku bądź
wykonania efektu ubocznego,
➤ kończą sekwencję operacji strumieniowych (ang. stream
pipeline).
ZRÓWNOLEGLANIE STRUMIENI
➤ Metody:
➤ parallelStream() - podczas tworzenia
➤ parallel() - dla utworzonego strumienia
➤ Nie wszystkie operacje na strumieniach da się zrównoleglić.
➤ Warunek konieczny zrównoleglenia: brak zmiany stanu
PORZĄDEK ELEMENTÓW W STRUMIENIACH
➤ Zależny od źródłowej struktury danych.
➤ Operacja sorted().
➤ Operacja unsorted().
➤ Pominięcie kolejności elementów może zwiększyć wydajność.
OPERACJE REDUKCJI
➤ Redukcja to operacja, która dla ciągu elementów daje skalarny
wynik (np. suma), bądź akumuluje elementy w nowej liście.
➤ Ogólne operacje redukcji:
➤ reduce()
➤ collect()
➤ Wyspecjalizowane operacje redukcji:
➤ sum()
➤ max()
➤ count()
➤ ...
OPERACJE REDUKCJI - PRZYKŁADY
int adultsCount = people.stream()

.filter(person -> person.getAge() >= 18) 

.count();
int totalSalaryExpenses = people.stream()

.mapToInt(Person::getSalary)

.sum();
KLASA COLLECTORS
Set<String> set = people.stream().map(Person::getName) 

.collect(Collectors.toList());
Set<String> set = people.stream().map(Person::getName) 

.collect(Collectors.toCollection(TreeSet::new));
String joined = things.stream() .map(Object::toString) 

.collect(Collectors.joining(“, "));
int total = employees.stream()

.collect(Collectors.summingInt(Employee::getSalary)));
Map<Department, List<Employee>> byDept = 

employees.stream()

.collect(Collectors.groupingBy(Employee::getDept));
Źródło: http://docs.oracle.com/javase/8/docs/api/java/ util/stream/
Collectors.html
“Truth can only be found in one place:
the code.
-Robert C. Martin
DZIĘKUJĘ
Krzysztof Pawłowski @krzychpawlowski
Przykłady dostępne pod adresem:
http://tinyurl.com/ajug-java8

More Related Content

Similar to Lambdy strumienie

Python szybki start
Python   szybki startPython   szybki start
Python szybki startSages
 
Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8
Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8
Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8Szymon Stępniak
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPPiotr Gabryjeluk
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaMaciej Ziarko
 
Erlang
ErlangErlang
Erlangkonryd
 
Pakiet XML - Maciej Beręsewicz
Pakiet XML - Maciej BeręsewiczPakiet XML - Maciej Beręsewicz
Pakiet XML - Maciej BeręsewiczMaciej Beręsewicz
 
Układy z pamięcią
Układy z pamięciąUkłady z pamięcią
Układy z pamięciąBorek12345
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaBartlomiej Zass
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł GrajewskiPROIDEA
 
Linux command line - Przewodnik
Linux command line - PrzewodnikLinux command line - Przewodnik
Linux command line - PrzewodnikOskar Wycislak
 
Skalowanie PostgreSQL @ DBConf.PL 2014
Skalowanie PostgreSQL @ DBConf.PL 2014Skalowanie PostgreSQL @ DBConf.PL 2014
Skalowanie PostgreSQL @ DBConf.PL 2014Filip Rembialkowski
 

Similar to Lambdy strumienie (14)

Python szybki start
Python   szybki startPython   szybki start
Python szybki start
 
Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8
Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8
Toruń JUG - Wprowadzenie do wybranych zagadnień JDK 8
 
DSL - DYI
DSL - DYIDSL - DYI
DSL - DYI
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHP
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
 
Erlang
ErlangErlang
Erlang
 
Pakiet XML - Maciej Beręsewicz
Pakiet XML - Maciej BeręsewiczPakiet XML - Maciej Beręsewicz
Pakiet XML - Maciej Beręsewicz
 
Układy z pamięcią
Układy z pamięciąUkłady z pamięcią
Układy z pamięcią
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
 
Linux command line - Przewodnik
Linux command line - PrzewodnikLinux command line - Przewodnik
Linux command line - Przewodnik
 
DTrace
DTraceDTrace
DTrace
 
Skalowanie PostgreSQL @ DBConf.PL 2014
Skalowanie PostgreSQL @ DBConf.PL 2014Skalowanie PostgreSQL @ DBConf.PL 2014
Skalowanie PostgreSQL @ DBConf.PL 2014
 

Lambdy strumienie

  • 1. AKADEMIA JUG WYRAZENIA LAMBDA I STRUMIENIE
 05.04.2017 Krzysztof Pawłowski ◇@krzychpawlowski ƛ
  • 2. CZYM JEST WYRAŻENIE LAMBDA? ➤ sparametryzowany blok kodu ➤ lista formalnych parametrów i ciało funkcji ➤ “anonimowa funkcja” Przykłady: () -> 1 x -> x * x (x, y) -> (x + y) (String s1, String s2) -> (s1.equals(s2)) (String s) -> System.out.println(s)
  • 3. PO CO NAM WYRAŻENIA LAMBDA? ➤ Wsparcie dla kolekcji - łatwiejsze iterowanie, filtrowanie, wyciąganie danych ➤ Jasne i zwięzłe implementowanie interfejsu funkcyjnego ➤ Zwiększenie wydajności w środowiskach wielordzeniowych
  • 4. ITEROWANIE ZEWNĘTRZNE VS ITEROWANIE WEWNĘTRZNE ➤ Iterowanie zewnętrzne
 
 List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
 for (int number : numbers) {
 System.out.println(number);
 }
 ➤ Iterowanie wewnętrzne
 
 List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
 numbers.forEach(value -> System.out.println(value));
  • 5. INTERFEJS FUNKCYJNY VS WYRAŻENIE LAMBDA ➤ Interfejs funkcyjny
 public interface ActionListener extends EventListener {
 public void actionPerformed(ActionEvent e);
 }
 
 public class ListenerTest {
 public static void main(String[] args) {
 JButton testButton = new JButton(“Test Button");
 testButton.addActionListener(new ActionListener() {
 @Override 
 public void actionPerformed(ActionEvent e) {
 System.out.println(
 “Click Detected by Anon Class");
 }
 });
 }
 }
  • 6. INTERFEJS FUNKCYJNY VS WYRAŻENIE LAMBDA ➤ Wyrażenie lambda
 
 public class ListenerTest {
 public static void main(String[] args) {
 JButton testButton = new JButton("Test␣Button");
 testButton.addActionListener(e -> 
 System.out.println("Click␣Detected␣by␣Anon␣Class"));
 }
 }
  • 7. JAKIEGO TYPU MOGĄ BYĆ WYRAŻENIA LAMBDA? ➤ Interfejsy z pakietu java.util.function ➤ Predicate<T> ➤ Consumer<T> ➤ Function<T, R> ➤ Supplier<T> ➤ (…) ➤ więcej pod adresem: http://docs.oracle.com/javase/8/ 
 docs/api/java/util/function/package-summary.html ➤ Zdefiniowany przez nas interfejs funkcyjny
  • 8. PREDICATE<T> public interface Predicate<T> {
 default Predicate<T> and(Predicate<? super T> other);
 static <T> Predicate<T> isEqual(Object targetRef);
 default Predicate<T> negate();
 default Predicate<T> or(Predicate<? super T> other);
 boolean test(T t);
 } Przykład: Predicate <String> stringsLongerThan10 = 
 (String s) -> s.length() > 10; boolean isLongerThan10 = 
 stringsLongerThan10.test(‘‘Ala ma kota.’’)
  • 9. CONSUMER<T> public interface Consumer<T> {
 default Consumer<T> andThen(Consumer<? super T> after);
 void accept(T t);
 } Przykład: Consumer <String> printToStdOut =
 (String s) -> System.out.print(s); printToStdOut.accept(“Hello World!”);
  • 10. FUNCTION<T, R> public interface Function<T, R> {
 default Function<T, R> andThen(Function<? super T, 
 ? extends R> after);
 default Function<T, R> compose(Function<? super T, 
 ? extends R> before);
 static Function<T, T> identity();
 R apply(T t);
 } Przykład: Function <String, Integer > stringLength = 
 (String s) -> s.length(); int strLen = stringLength.apply(“Ala ma kota.”);
  • 11. SUPPLIER<T,> public interface Supplier<T> {
 T get();
 } Przykład: Supplier <String > stringSupplier =
 () -> new String(“Ala ma kota"); String s = stringSupplier.get();
  • 12. “Talk is cheap. Show me the code. -Linus Torvalds
  • 13. PRZEKAZYWANIE METOD ➤ Za pomocą wyrażeń lambda tworzyliśmy funkcje anonimowe ➤ Jako parametry funkcji możemy przekazywać nazwane metody: ➤ statyczne - NazwaKlasy::nazwaStatycznejMetody ➤ instancji klas - nazwaObiektu::nazwaMetody lub NazwaKlasy::nazwaMetody ➤ konstruktor - NazwaKlasy::new Przykład: List<Integer> numbers = Arrays.asList(1, 2, 3, 4); numbers.forEach(System.out::println);
  • 14. METODY DOMYŚLNE ➤ Wprowadzone, aby do Collections API móc wprowadzić Streams API. ➤ Pozwalają rozszerzać interfejsy o domyślną implementację metod z zachowaniem wstecznej kompatybilności. ➤ Mogą być dodane do każdego interfejsu - wtedy klasa implementująca ten interfejs, jeśli nie nadpisze tej metody, odziedziczy domyślną implementację tej metody.
  • 15. METODY DOMYŚLNE - PROBLEM DIAMENTU interface Foo { default void talk() { System.out.println("Foo!"); 
 } } interface Bar { default void talk() { System.out.println("Bar!"); 
 } } public class FooBar implements Foo, Bar { // ??? }
  • 16. METODY DOMYŚLNE - PROBLEM DIAMENTU interface Foo { default void talk() { System.out.println("Foo!"); 
 } } interface Bar { default void talk() { System.out.println("Bar!"); 
 } } public class FooBar implements Foo, Bar { public void talk() { Foo.super.talk(); } }
  • 17. CZYM SĄ STRUMIENIE W JAVIE 8? ➤ Klasy z pakietu java.util.stream. ➤ Wspierają operacje funkcyjne na sekwencjach elementów (strumieniach): ➤ redukcje (ang. reduce) – suma, średnia, min itd., ➤ odwzorowania (ang. map), filtrowanie. ➤ Wspierają zrównoleglanie operacji. ➤ Są zintegrowane z Collections API.
  • 18. KOLEKCJE VS STRUMIENIE ➤ Strumienie w przeciwieństwie do kolekcji: ➤ nie przechowują elementów, ➤ mają naturę funkcyjną (źródłowa kolekcja nie jest modyfikowana), ➤ stosują leniwe wyliczanie, ➤ mogą być nieograniczone, ➤ mogą być odwiedzone tylko raz w ich cyklu życia (jak iterator).
  • 19. OPERACJE NA STRUMIENIACH ➤ Operacje na strumieniach dzielimy na ➤ pośrednie (ang. intermediate): ➤ jako wynik dają nowy strumień, ➤ są wyliczane leniwie, ➤ mogą przechowywać stan (np. distinct, sorted) bądź nie przechowywać stanu (np. filter, map), ➤ końcowe (ang. terminal): ➤ przechodzą przez strumień w celu obliczenia wyniku bądź wykonania efektu ubocznego, ➤ kończą sekwencję operacji strumieniowych (ang. stream pipeline).
  • 20. ZRÓWNOLEGLANIE STRUMIENI ➤ Metody: ➤ parallelStream() - podczas tworzenia ➤ parallel() - dla utworzonego strumienia ➤ Nie wszystkie operacje na strumieniach da się zrównoleglić. ➤ Warunek konieczny zrównoleglenia: brak zmiany stanu
  • 21. PORZĄDEK ELEMENTÓW W STRUMIENIACH ➤ Zależny od źródłowej struktury danych. ➤ Operacja sorted(). ➤ Operacja unsorted(). ➤ Pominięcie kolejności elementów może zwiększyć wydajność.
  • 22. OPERACJE REDUKCJI ➤ Redukcja to operacja, która dla ciągu elementów daje skalarny wynik (np. suma), bądź akumuluje elementy w nowej liście. ➤ Ogólne operacje redukcji: ➤ reduce() ➤ collect() ➤ Wyspecjalizowane operacje redukcji: ➤ sum() ➤ max() ➤ count() ➤ ...
  • 23. OPERACJE REDUKCJI - PRZYKŁADY int adultsCount = people.stream()
 .filter(person -> person.getAge() >= 18) 
 .count(); int totalSalaryExpenses = people.stream()
 .mapToInt(Person::getSalary)
 .sum();
  • 24. KLASA COLLECTORS Set<String> set = people.stream().map(Person::getName) 
 .collect(Collectors.toList()); Set<String> set = people.stream().map(Person::getName) 
 .collect(Collectors.toCollection(TreeSet::new)); String joined = things.stream() .map(Object::toString) 
 .collect(Collectors.joining(“, ")); int total = employees.stream()
 .collect(Collectors.summingInt(Employee::getSalary))); Map<Department, List<Employee>> byDept = 
 employees.stream()
 .collect(Collectors.groupingBy(Employee::getDept)); Źródło: http://docs.oracle.com/javase/8/docs/api/java/ util/stream/ Collectors.html
  • 25. “Truth can only be found in one place: the code. -Robert C. Martin
  • 26. DZIĘKUJĘ Krzysztof Pawłowski @krzychpawlowski Przykłady dostępne pod adresem: http://tinyurl.com/ajug-java8