Commit 4594ceb5 by Patryk Czarnik

dopiski do streamów i PanTadeusz

parent fab1f889
...@@ -5,9 +5,9 @@ import java.util.List; ...@@ -5,9 +5,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class Grupowanie1 { public class Grupowanie1 {
// W tej wersji widzimy klasyczny algorytm "agregacji danych za pomocą slownika" // W tej wersji widzimy klasyczny algorytm "agregacji danych za pomocąownika"
// Listę pracowników przeglądamy tylko raz, na bieżąco aktualizując słowniki. // Listę pracowników przeglądamy tylko raz, na bieżąco aktualizując słowniki.
// W tej wersji używamy tylko podstawowych operacji na kolekcjach (sprzed Java 8 // W tej wersji używamy tylko podstawowych operacji na kolekcjach (sprzed Java 8)
public static void main(String[] args) { public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj(); List<Employee> emps = ObslugaCSV.wczytaj();
......
...@@ -15,7 +15,7 @@ public class Grupowanie3 { ...@@ -15,7 +15,7 @@ public class Grupowanie3 {
for(Employee emp : emps) { for(Employee emp : emps) {
// co wstawić w razie braku danych (gdy dane już są - krok jest pomijany) // co wstawić w razie braku danych (gdy dane już są - krok jest pomijany)
sumy.putIfAbsent(emp.getJobTitle(), 0); sumy.putIfAbsent(emp.getJobTitle(), 0);
// w jaki sposób uzyskuje się nową wartość na podstawie klucza oraz starej wartości // w jaki sposób uzyskuje się nową wartość na podstawie klucza oraz starej wartości
sumy.computeIfPresent(emp.getJobTitle(), (job, staraSuma) -> staraSuma + emp.getSalary()); sumy.computeIfPresent(emp.getJobTitle(), (job, staraSuma) -> staraSuma + emp.getSalary());
ilosci.putIfAbsent(emp.getJobTitle(), 0); ilosci.putIfAbsent(emp.getJobTitle(), 0);
......
...@@ -35,17 +35,17 @@ public class NoweOperacjeList { ...@@ -35,17 +35,17 @@ public class NoweOperacjeList {
System.out.println(); System.out.println();
System.out.println(); System.out.println();
List<String> lista1 = (List<String>)lista.clone(); List<String> lista1 = new ArrayList<>(lista);
System.out.println(lista1); System.out.println(lista1);
// predykat; operacja usuwa z listy wszystkie spełaniające warunek // predykat; operacja usuwa z listy wszystkie spełaniające warunek
lista1.removeIf(s -> s.length() <= 3); lista1.removeIf(s -> s.length() <= 3);
System.out.println(lista1); System.out.println(lista1);
System.out.println(); System.out.println();
List<String> lista2 = (List<String>)lista.clone(); List<String> lista2 = new ArrayList<>(lista);
System.out.println(lista2); System.out.println(lista2);
lista2.replaceAll(s -> s.toUpperCase()); // lambda expression // lista2.replaceAll(s -> s.toUpperCase()); // lambda expression
// lista2.replaceAll(String::toUpperCase); // method reference - w tym przypadku równoważnie lista2.replaceAll(String::toUpperCase); // method reference - w tym przypadku równoważnie
System.out.println(lista2); System.out.println(lista2);
System.out.println(); System.out.println();
} }
......
...@@ -58,13 +58,13 @@ public class C12_FlatMap { ...@@ -58,13 +58,13 @@ public class C12_FlatMap {
// zero (!), jeden, dowolną skończoną liczbę, a nawet nieskońćzoność. // zero (!), jeden, dowolną skończoną liczbę, a nawet nieskońćzoność.
// Funkcja mapuje wartości na strumienie - wynikiem jest strumień wartości. // Funkcja mapuje wartości na strumienie - wynikiem jest strumień wartości.
System.out.println("Płaskie mapowanie:"); System.out.println("Płaskie mapowanie:");
Stream.of(1, 3, 5) Stream.of(1, 3, 0, 5)
.flatMap(x -> C12_FlatMap.generuj(x).stream()) .flatMap(x -> C12_FlatMap.generuj(x).stream())
.forEach(x -> System.out.print(x + " | ")); .forEach(x -> System.out.print(x + " | "));
System.out.println(); System.out.println();
System.out.println(); System.out.println();
Stream.of(1, 3, 5) Stream.of(1, 3, 0, 5)
.flatMap(C12_FlatMap::generujStrumien) .flatMap(C12_FlatMap::generujStrumien)
.forEach(x -> System.out.print(x + " | ")); .forEach(x -> System.out.print(x + " | "));
System.out.println(); System.out.println();
......
...@@ -31,7 +31,7 @@ public class KlasaOptional { ...@@ -31,7 +31,7 @@ public class KlasaOptional {
try { try {
System.out.println(napis0.get()); System.out.println(napis0.get());
} catch (Exception e) { } catch (Exception e) {
System.err.println("próba odczytu napis0.get(): " + e); System.out.println("próba odczytu napis0.get(): " + e);
} }
System.out.println(); System.out.println();
...@@ -95,7 +95,6 @@ public class KlasaOptional { ...@@ -95,7 +95,6 @@ public class KlasaOptional {
System.out.println("hej " + opt.map(String::toLowerCase).orElse("nieznajomy")); System.out.println("hej " + opt.map(String::toLowerCase).orElse("nieznajomy"));
} }
System.out.println(); System.out.println();
//
for(Optional<String> opt : lista) { for(Optional<String> opt : lista) {
String napis = opt.filter(s -> s.startsWith("O")).map(String::toUpperCase).orElse("---"); String napis = opt.filter(s -> s.startsWith("O")).map(String::toUpperCase).orElse("---");
......
package pan_tadeusz;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class PoliczSlowaStream {
private static final String SEP = "[^\\p{L}\\d]+";
public static void main(String[] args) {
try(Stream<String> lines = Files.lines(Paths.get("pan_tadeusz.txt"), Charset.forName("UTF-8"))) {
lines.flatMap(line -> Stream.of(line.split(SEP)))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEachOrdered(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));
} catch(IOException e) {
e.printStackTrace();
}
}
}
...@@ -21,7 +21,7 @@ import java.util.stream.Stream; ...@@ -21,7 +21,7 @@ import java.util.stream.Stream;
* jest realizowana bezpośrednio przez JVM. Natomaist dla klas `BigDecimal` oraz `LocalDate` * jest realizowana bezpośrednio przez JVM. Natomaist dla klas `BigDecimal` oraz `LocalDate`
* tworzę własną implementację tego mechanizmu opartą o słowniki. * tworzę własną implementację tego mechanizmu opartą o słowniki.
* Ta technika służy przede wszystkim oszczędzaniu pamięci, * Ta technika służy przede wszystkim oszczędzaniu pamięci,
* może zwrócić się czasowo, jeśli dane po wczytaniu będą później intensywnie używane chociażby w porównaniach, * może zwrócić się czasowo, jeśli dane po wczytaniu będą później intensywnie używane chociażby w porównaniach,
* jest poprawna w przypadku klas niemutowalnych. * jest poprawna w przypadku klas niemutowalnych.
*/ */
...@@ -34,6 +34,7 @@ public class MaszynaWczytujaca2 { ...@@ -34,6 +34,7 @@ public class MaszynaWczytujaca2 {
String[] pola = linia.split(","); String[] pola = linia.split(",");
int sztuk = Integer.parseInt(pola[6]); int sztuk = Integer.parseInt(pola[6]);
// "2020-03-04" → LocalDate(2020, 3, 4)
LocalDate data = pulaDat.computeIfAbsent(pola[0], LocalDate::parse); LocalDate data = pulaDat.computeIfAbsent(pola[0], LocalDate::parse);
BigDecimal cena = pulaCen.computeIfAbsent(pola[5], BigDecimal::new); BigDecimal cena = pulaCen.computeIfAbsent(pola[5], BigDecimal::new);
......
...@@ -20,6 +20,5 @@ public class Opt4 { ...@@ -20,6 +20,5 @@ public class Opt4 {
.orElseGet(() -> "Nie znaleziono rekordów w mieście " + miasto); .orElseGet(() -> "Nie znaleziono rekordów w mieście " + miasto);
JOptionPane.showMessageDialog(null, tekst); JOptionPane.showMessageDialog(null, tekst);
} }
} }
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