Commit 68309154 by Patryk Czarnik

emps funkcyjnie - pierwsze przykłady

parent de4b263d
package emps.v3_funkcyjnie;
import java.util.List;
public class P0_WypiszWszystko {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
// Aby zrobić coś dla każdego elementu listy, np. wypisać na ekran,
// można użyć operacji forEach.
// Do forEach można przekazać wyrażenie lambda mówiące, co zrobić z każdym elementem.
// emps.forEach(emp -> System.out.println(emp));
// W przypadku, gdy operacja sprowadza się do wywołania konkretnej metody, można uzyć notacji "method reference".
emps.forEach(System.out::println);
// Można też najpierw pobrać "strumień" i dopiero na strumienia wywołać forEach, ale tu nie jest to konieczne.
// emps.stream().forEach(System.out::println);
}
}
package emps.v3_funkcyjnie;
import java.util.List;
public class P1_WypiszDane {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
// Cel: wypisać wybrane pola.
// Sposób 1: w wyrażeniu lambda napisać printa, który wypisuje wybrane rzeczy
// emps.forEach(emp -> System.out.println(emp.getFirstName() + " " + emp.getLastName() + " " + emp.getSalary()));
// Sposób 2, oparty o stream: najpierw mapujemy obiekty Employee na Stringi, a następnie wypisujemy te Stringi
emps.stream()
.map(emp -> emp.getFirstName() + " " + emp.getLastName() + " " + emp.getSalary())
.forEach(System.out::println);
}
}
package emps.v3_funkcyjnie;
import java.util.List;
public class P2_Filtrowanie {
// Program wypisuje tylko zarabiających >= 10 tys,
// realizujemy to filtrowanaiem, ale przy okazji pokazuję Wam schemat "filter / map" - podstawowe operacje na strumieniach.
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
emps.stream()
.filter(emp -> emp.getSalary() >= 10_000)
.map(emp -> emp.getFirstName() + " " + emp.getLastName() + " " + emp.getSalary())
.map(String::toUpperCase) // ew. .map(s -> s.toUpperCase())
.forEach(System.out::println);
// Cały ten ↑ zapis jest określany "pipeline", który składa się z:
// - źródła danych
// - dowolnej liczby operacji pośrednich (intermediate, tutaj są to filter i map)
// - operacji końcowej (terminal, tutaj jest to forEach)
// Każdy obiekt przechodzi przez kolejne etapy przetwarzania, "schodzi z góry w dół".
}
}
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.OptionalDouble;
import java.util.stream.Collectors;
public class P3_SredniaWszystkich {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
/*
// Uwaga, to nie zadziała; to nie tak się robi.
// Wewnątrz wyrażeń lambda nie wolno modyfikować zmiennych lokalnych zdefiniowanych na zewnątrz tych wyrażeń.
// (generalnie - nie wolno uzywać zmiennych, które nie są "effectively final"
double suma = 0;
int ile = 0;
emps.forEach(emp -> {
suma += emp.getSalary();
ile++;
});
*/
// Można użyć gotowych dedykowanych rozwiązań
// 1) IntStream
OptionalDouble srednia1 = emps.stream()
.mapToInt(Employee::getSalary)
.average();
System.out.println(srednia1);
// Gdyby strumień był pusty, to wynikiem byłby pusty Optional.
// Aby dostać się do samej liczby, najelepiej zrobić to tak (w razie braku danych podstawi 0):
double srednia2 = emps.stream()
.mapToInt(Employee::getSalary)
.average()
.orElse(0);
System.out.println(srednia2);
// 2) odpowiedni Collector, czyli taka maszynka, która zbiera dane i na końcu zwraca wynik
Double srednia3 = emps.stream().collect(Collectors.averagingInt(Employee::getSalary));
System.out.println(srednia3);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment