JavaRush /Blog Java /Random-PL /Lambdy i strumienie, tylko praktyka, bez teorii

Lambdy i strumienie, tylko praktyka, bez teorii

Opublikowano w grupie Random-PL
Cześć wszystkim. Przy okazji konkursu postanowiłem napisać tutaj nie artykuł, ale krótką lekcję. Będzie o lambdach i strumieniach w Javie. Jeśli już je znasz i używasz, przejdź od razu do końca artykułu, znajdziesz tam niewielki wybór zadań z JavaRush, nad którymi możesz poćwiczyć. Potrzebujesz Java 8 i wyższej, szkolenia od JR, będzie mało szczegółów i dużo niezrozumiałych rzeczy, silna chęć rozpracowania tego. Zacznijmy od tego, że nie będę wyjaśniał historii pojawiania się lambd i strumieni, po prostu sam tego nie wiem. Wiem tylko, że wyszły one ze stylu programowania funkcjonalnego, do naszego stylu OOP. W moim krótkim doświadczeniu edukacyjnym po prostu pokazałem, jak i co, niektórym osobom trudno jest zrozumieć ideę, więc pamiętaj tylko, jak pisać, zrozumiesz później.

Lambdy

Lambdy i strumienie, tylko praktyka, bez teorii - 1Lambdy i strumienie, tylko praktyka, bez teorii - 2Jeśli w ogóle nie wiesz, czym są lambdy, to: Lambda wygląda następująco:
(a, b) -> a.compareTo(b)
(переменные) -> действие
To na razie wystarczy. Teorię możesz przeczytać tutaj: link pierwszy , link drugi , ale myślę, że praktyka jest o wiele zabawniejsza. Sugeruję rozwiązanie następującego problemu: Napisz kalkulator, korzystając z metody 1. Metoda powinna akceptować 2 wartości cyfrowe i coś jeszcze. Twój kod będzie wyglądał mniej więcej tak:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Musisz wpisać 3 parametry w sygnaturze metody calculate, dodać 1 polecenie returni przetestować wywołanie tej metody w main. Co powinna potrafić ta metoda?
  • zginać;
  • zwielokrotniać;
  • dzielić;
  • odejmować;
  • obliczyć pierwiastek;
  • podnieść do potęgi;
  • podnieś do potęgi sumę argumentów podzieloną przez pierwszą liczbę + 117;
  • i wszystkie inne operacje, jakie możesz wymyślić.
Czego nie używać:
  • if-else;
  • charjako wskaźnik działania;
  • switch-case;
  • i wszystko inne co przyjdzie Ci do głowy.
Czego możesz użyć:
  • Tylko lambdy, na nich jest zadanie.
- Co? I to wszystko? - Tak, to wszystko, bo dosłownie trzeba dodać 3 linijki, jeśli zasugeruję chociaż jedną, reszta zostanie dopisana automatycznie. A jeśli chcesz, możesz poszukać przykładów w Google i spróbować zrozumieć. Oczywiście sprawdzisz sam i jeśli oszukasz, nikt się nie dowie, ale w takim razie po co? Po rozwiązaniu tak prostego problemu wszyscy moi uczniowie w wersji 1.5 mniej więcej zrozumieli, czym są lambdy i jak z nich korzystać. Będzie to bardzo potrzebne do przesyłania strumieniowego. Jeżeli chcesz się pochwalić efektem i przekonać się czy dobrze wykonałaś prześlij kod w wiadomości prywatnej. Nie ma potrzeby komentować, można tam dodać ciekawe wskazówki (ale w taki sposób, aby zadanie nie było zbyt łatwe). Ponownie, po rozwiązaniu tego przykładu, powinieneś już mniej więcej wiedzieć, jak używać lambd.
Lambdy i strumienie, tylko praktyka, bez teorii - 3
Przejdźmy teraz do strumieni Java. To nie są strumienie, o których mogłeś pomyśleć, czytelniku. Nie, nie jest inputStreami nie jest OutputStream. Jest inaczej, ciekawiej. Strumienie zastąpiły cykle, nie całkowicie, ale jednak. Podaje się je pod hasłem „nie tłumacz, jak to zrobić, wyjaśnij, co robić”. Mały przykład strumienia:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
Co tu się dzieje? Dodajmy komentarze:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Porównaj ze zwykłą pętlą:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Kiedy czytasz kod, wszystko wygląda przerażająco, ale czy łatwiej jest z komentarzami? To normalne, ja też ich długo nie rozumiałem. Kluczem do zrozumienia jest praktyka. Dlatego zaczynamy czytać artykuły obcych i szukać odpowiedzi na nasze pytania, możesz je zadać również tutaj w komentarzach, nie podam pełnej odpowiedzi, ale wskażę kierunek. Lista zadań z JavaRush, które moim zdaniem świetnie nadają się do ćwiczenia przesyłania strumieniowego:
  • 2208 - można rozwiązać za pomocą 1 strumienia i 1 powrotu, tj. treść metody zacznie się od, returna następnie będzie 1 cały strumień. Pomińmy to wymaganie StringBuilder.

  • 1908 - można to również rozwiązać za pomocą 1 strumienia i 1 powrotu. Zacznij od odczytania pliku. Nie wiem jak nagrać do pliku poprzez strumienie (o ile jest taka możliwość), na razie robimy to ręcznie. Te. Otwieramy tylko 2 strumienie (konsola i zapis do pliku). Odczytujemy plik za pomocą metod, które zwrócą nam arkusz lub strumień (google i javadoc).

  • 1907 - teoretycznie da się to też rozwiązać w jednym strumieniu. Dane wejściowe do strumienia to nazwa pliku, wyjście to liczba słów świata.

To wszystko. Jeśli mi się uda, napiszę kolejną prostą historię. Moim zdaniem czytanie o czymś fajnym bez możliwości wypróbowania tego jest jakoś nudne czy coś. A po kalkulatorze i 3 łamigłówkach myślę, że już dobrze radzisz sobie z lambdami i strumieniami, więc przeczytaj o wszystkich możliwościach, jeśli jeszcze tego nie zrobiłeś. UPD:
  • 1016 - w nieco przewrotny sposób można to rozwiązać w 1 strumieniu i 1 powrocie;

  • 1821 - bardzo łatwo i w 1 strumieniu i 1 powrocie.

    Te 2 zadania wprowadzą Cię w inną metodę przesyłania strumieniowego i innego kolekcjonera.

  • 1925 - można pobrać linijkę ze słowami w jednym strumieniu i potem zapisać ją do pliku (nie wiem, czy da się zapisać do pliku ze strumienia)

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION