Commit 69cbf8ac by Patryk Czarnik

średnia i grupowanie - wersje funkcyjne

parent 3a0d6724
...@@ -21,7 +21,7 @@ public class F2_WypiszBogatych { ...@@ -21,7 +21,7 @@ public class F2_WypiszBogatych {
// Ogólnie taka konstrukcja w kodzie nazywa się "pipeline": // Ogólnie taka konstrukcja w kodzie nazywa się "pipeline":
// - źródło_danych // - źródło_danych
// - operacje pośrednie (intermediate operation, może być wiele kroków), np: filter, map, limit, sorted, distinct, ... // - operacje pośrednie (intermediate operation, może być wiele kroków), np: map (różne wersje), filter, limit, sorted, distinct, ...
// - operacja końcowa (terminal operation), np: forEach, forEachOrdered, reduce, collect, findFirst, ... // - operacja końcowa (terminal operation), np: forEach, forEachOrdered, reduce, collect, findFirst, ...
System.out.println("\nBIEDNI:"); System.out.println("\nBIEDNI:");
......
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.stream.Collectors;
public class F3_SredniaWszystkich {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
double srednia = emps.stream()
.mapToInt(Employee::getSalary)
.average()
.orElse(0);
System.out.println("Średnia pensja wszystkich: " + srednia);
double srednia2 = emps.stream().collect(Collectors.averagingInt(Employee::getSalary));
System.out.println("Średnia pensja wszystkich: " + srednia2);
}
}
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.OptionalDouble;
import javax.swing.JOptionPane;
public class F4_SredniaJedenJob {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
String szukanyJob = JOptionPane.showInputDialog("Podaj nazwę stanowiska", "Programmer");
OptionalDouble srednia = emps.stream()
.filter(emp -> emp.getJobTitle().equals(szukanyJob))
.mapToInt(Employee::getSalary)
.average();
if(srednia.isPresent()) {
JOptionPane.showMessageDialog(null, "Średnia pensja: " + srednia.getAsDouble());
} else {
JOptionPane.showMessageDialog(null, "Nikt nie pracuje na stanowisku " + szukanyJob,
"Brak dancyh", JOptionPane.WARNING_MESSAGE);
}
}
}
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Grupowanie_f1 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
// Dla podanego jobTitle, wartością jest lista tych pracowników, którzy mają takie jobTitle.
Map<String, List<Employee>> grupy = emps.stream().collect(Collectors.groupingBy(Employee::getJobTitle));
// Sposób wypisywania danych ze słownika dostępny od Java 8.
grupy.forEach((job, lista) -> {
System.out.println("Stanowisko " + job + ":");
lista.forEach(emp -> {
System.out.println(" * " + emp.getFirstName() + " " + emp.getLastName() + " " + emp.getSalary());
});
System.out.println();
});
}
}
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Grupowanie_f2 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
// W tej wersji do groupingBy dodajemy parametr (kolejny collector) mówiący, co zrobić z każdą grupą.
// Dla każdej grupy liczymy średnią pensję.
Map<String, Double> grupy = emps.stream().collect(
Collectors.groupingBy(Employee::getJobTitle,
Collectors.averagingInt(Employee::getSalary)));
grupy.forEach((job, srednia) -> {
System.out.printf("%32s → %8.2f%n", job, srednia);
});
}
}
package emps.v3_funkcyjnie;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class Grupowanie_f3 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
// W tej wersji wyliczamy nie tylko średnią, ale ogólne "statystyki" (podobnie, jak w Grupowanie_v7).
// Niezależnie od tego do kolektora groupingBy przekazuję też parametr TreeMap::new
// co powoduje użycie TreeMap zamiast HashMap
Map<String, IntSummaryStatistics> grupy = emps.stream().collect(
Collectors.groupingBy(Employee::getJobTitle,
TreeMap::new,
Collectors.summarizingInt(Employee::getSalary)));
grupy.forEach((job, stats) -> {
// System.out.printf("%32s → %s%n", job, stats);
System.out.printf("| %-32s | %2d | %5d | %8.2f | %5d |%n",
job, stats.getCount(), stats.getMin(), stats.getAverage(), stats.getMax());
});
}
}
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