Commit ae2a34c3 by Patryk Czarnik

Grupowanie funkcyjnie

parent 3ab1fc85
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
// W tej wersji kolektor groupingBy zbiera rekordy w grupy, ale nie wylicza żadnych statystyk.
// Inne znaczenie słowa "grupowanie", niż w SQL.
public class Grupowanie7 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
Map<String, List<Employee>> grupy = emps.stream().collect(Collectors.groupingBy(Employee::getJobTitle));
// w tym słowniku dla danego jobTitle znajduje się lista wszystkich pracowników, którzy mają takie jobTitle
// System.out.println(grupy);
grupy.forEach((job, lista) -> {
System.out.printf("Stanowisko %s (%d osób):%n", job, lista.size());
lista.forEach(emp -> {
System.out.printf(" * %s %s ($%d)%n", 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;
// W tej wersji dla każdej grupy od razu obliczymy funkcję agregującą "average".
// Takie znaczenie słowa "grupowanie", jak w SQL.
public class Grupowanie8 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
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;
// W tej wersji dla każdej grupy od razu obliczymy "statystyki"
public class Grupowanie9 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
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());
});
}
}
package emps.v3_funkcyjnie;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class P5_MiastaBezPowtorzen {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
// sposób 1: utworzyć zbiór Stringów
// ma to sens, gdy potrzebujemy wykorzystać te dane w dalszej części programu
Set<String> miasta = emps.stream()
.map(Employee::getCity)
.collect(Collectors.toSet());
System.out.println(miasta);
System.out.println("--------");
// sposób 2: w łańcuchu poleceń (pipeline) umieścić operację distinct
// ma to sens, gdy wykonujemy tylko jedną operację, np, chcemy tylko wypisać te miasta
emps.stream()
.map(Employee::getCity)
.filter(s -> !s.isEmpty())
.distinct()
.sorted()
.forEach(System.out::println);
}
}
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