Java 8 Stream Tutorial część 2

Jak widzieliście w poprzednim wpisie, streamy są … fajne.

Można dzięki nim w końcu zacząć pisać kod, który jest bardziej przejrzysty, możemy w końcu zacząć pisać coraz bardziej funkcyjnie. W tym wpisie pokażę tak na prawdę podstawy podstaw jak się bawić ze streamami i jak sobie życie upraszczać 🙂

As you have seen in my previous entry, streams are… cool 🙂

Thanks to them, we can finally start wrtiting code, which is clear, more functional.
In this entry i will show you the basics of streams, and how to make coding life easier 🙂

Będzie tutaj już trochę więcej pisania, cały kod można sobie pobrać z mojego githuba:

https://github.com/najavie/streamExample1.git

Wiekszość metod, to tak na prawdę jednolinijkowce, i to jest właśnie piękne 🙂

Aby można było na czymś pracować, stworzyłem kilka klas:

 

Zwykłe klasy, plus jakieś metody, ułatwiające mi generowanie obiektów. Żaden rocket-science 🙂

 

Jak teraz łatwo i szybko stworzyć 100 osób?

Można klasycznie za pomocą pętli for, ale tego tutaj nie zrobię, użyjemy znanego już intStream

Proste? 🙂 Użyłem IntStream, którego poprosiłem o wygenerowanie intów od 1 do 10, następnie metodą mapToObj zamieniłem daną wartość na obiekt typu Person. A potem wrzuciłem to do jednego worka (Listy)  🙂 Wszystko w jednej zgrabnej linijce.

I co by z tymi osobami zrobić? Może chcemy wyświetlić tylko imiona?

Nic prostszego…

No to teraz coś trudniejszego…
Jak widzicie, każdy obiekt person posiada listę numerów telefonów… chciałbym sobie pobrać z każdego obiektu typu Person taką listę telefonów i wrzucić go do wspólnej listy… Tutaj z pomocą przyjcie nam metoda flatMap… metoda flatMap jak sama nazwa wskazuje… spłaszcza…

Voila! Jedna ważna uwaga – jako, że pracujemy na streamach, to „spłaszczona” lista, też musi być streamem…

Wszystko fajnie, ale można … fajniej… wielowątkowo 😉 Niewielka różnica w przypadku prostych operacji jak w tych przykładach, ale gdy będzie więcej danych, większy poziom skomplikowania… zysk na wydajności murowany!

Jak widać… strasznie trudne 😉 kiedy używać stream(), a kiedy parallelStream() ? Nie to jest cel tego bloga, aby pisać o tym 😉 Polecam poczytać u źródła – http://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html

To teraz trochę trudniej. Jakiś manager na wczoraj potrzebuje metody do pobierania mapy <Imie:Listanumerówtelefonów> ! Co my z tym zrobimy?
napiszemy jedną linijkę…

Jak widać, klasa Collectors posiada kilka fajnych metod… toMap… parametr pierwszy to metoda/funkcja pobierająca klucz, parametr drugi dotyczy wartości… ale trudne 😉

Menago jednak stwierdził, że coś mu się pomyliło i potrzebuje jednak mapy<Miasto: ListaOsob> … omg… czy uda się to zrobić też w jednej linijce??

Udało się! I kolejna metoda klasy Collectors załatwiona… Tylko mała łyżeczka dziegciu na tą metodę… żeby można było grupować, to metoda pobierająca miasto, musi być w klasie, której listę pobieramy… inaczej się nie uda… ale to nie jest problem… napisanie jednego gettera..

Co dalej?

A może by tak… pobrać osoby, które są z Gdyni?? Banalne…

I jeszcze zrobiliśmy to wielowątkowo ! 😉

A ile jest tak na prawdę osób z Gdyni?

 

 

 

There will be some writings, all code is available on github. Sorry, comments are in polish, i’m starting to translate my blog to english too, but it will take some time 🙂

https://github.com/najavie/streamExample1.git

Most of the methods are simple one-liners, and that is a beauty

first, i have created some classess..

 

No rocket science here. Simple methods…

How to quickly create 100 persons?
We could do it in a for loop, but here, i will use IntStream

Simple? 😉 I asked IntStream to generate ints from 1 to 10, than with method mapToObj i have changed a value to object of type Person. And then.. all goes to a List… all in one simple line of code…

Now waht can wee do with those persons? Maybe we want their names?

Simple…

Now something difficult…
As you can see, object person have a list of phone numbers. I would like to create a list of telephone numbers from all persons…
I’m going to use flatMap method… which… flats a list… 🙂

Voila! One note here. our Flatted list is a stream…

All cool… but we cane make it even more cool by using parallel computing 😉

That was difficult… 🙂

Now very difficult task –

I want a map<Name:PhoneNumberList> now !

Collectors class have some really nice methods… toMap.. first parameter is a method for getting a key, and second is for a value…

Ok, what about map<City, Persons> ? Can we do it in one line??

Programming is easy 🙂

 

NEXT!

I want all persons from Gdynia (Gdynia is a city i live in… )

And we have done it in parallel !

And how many persons are from Gdynia?

 

too easy 🙂

 

 

«
»