29 lipca 2014

Programiści Scala, Play, Angularjs, HighCharts do projektu poszukiwani

0 komentarzy

Od ponad miesiąca wspieram moralnie (więcej) i merytorycznie (mniej) projekt moich znajomych, którzy po moich namowach weszli w Scalę z Play Framework i Angularjs z innymi dodatkami mniejszego znaczenia (i bez Akki). Projekt jest na prywatnym repo na GitHubie.

Mieliśmy już pewien epizod z firmą i jej juniorami, i nie wyszło.

Product owner/znawca tematu, co należałoby zbudować od strony biznesowej, jest w Warszawie do bezpośredniego kontaktu o (prawie) każdej porze.

Wchodzi w rachubę współpraca z firmą programistyczną lub pojedynczymi programistami - amatorami i profesjonalistami. Umowa o dzieło lub b2b czy jeszcze inaczej na żądanie. Do ustalenia.

Praca zdalnie lub na miejscu w Warszawie.

Projekt zakłada zbudowanie portalu dostawcy, który śledząc poczynania użytkowników oferuje im jeszcze lepszą ofertę. Nic specjalnie odkrywczego - ot kolejny portal, coś ala CRUD, ale bez D. Wykresy również wchodzą w rachubę i rozważamy HighCharts (może d3.js, jeśli osoba znająca się na temacie powie, że tak ma być). Znaczenie dla nas ma zawartość,  która już mamy. Potrzebujemy jedynie (?) platformy, aby je tam włożyć. I to jest właśnie ta robota!

Nie musisz wymiatać we wspomnianych technologiach i cenimy sobie przede wszystkim zaangażowanie i pomysłowość. Miejsce dyskutantów już obsadzone. Poszukujemy mróweczek = faktycznie zaangażowanych w przekucie pomysłu w czyn.

Zainteresowany? Skontaktuj się ze mną na jacek@japila.pl. Do usłyszenia!

P.s. To pierwszy wpis z klienta blogger na smartfona, więc wyrozumiałość braku formatowania oczekiwana.

28 czerwca 2014

Relacja ze spotkania scalowego o sbt i activator na deskach Toruń JUG

0 komentarzy
Dziękuję grupie Toruń Java User Group (TJUG) za przygotowanie spotkania i stworzenia atmosfery niczym nieskrępowanego przepływu wiedzy między uczestnikami.


Szczególne podziękowania należą się:

  • Szymonowi Stępniakowi @wololock - założycielowi TJUGa i osobie, która ziściła moje marzenie uruchomienia JUGa w Toruniu, za zaproszenie na prezentację na deskach Torun JUG oraz możliwości reklamy projektu scalania i wirtualno-stacjonarnych spotkań WarszawScaLa.
  • Piotrowi Prądzyńskiemu @prondzyn, który był łaskaw podzielić się swoimi uwagami odnośnie podobnego wystąpienia podczas 33rd Degree, co miało niebagatelny wpływ na zawartość merytoryczną tego spotkania.
  • "wodzireja” spotkania Piotrowi Modzelewskiemu @pmodzelewski za przedstawienie mnie przed moim wystąpieniem w takim sposób, że nawet pozbywając się ostatnich skrawków skromności, nie byłbym w stanie zrobić tego lepiej, co początkowo onieśmieliło mnie, ale ostatecznie zdopingowało do udowodnienia, że się faktycznie nie myli.
  • prelegentowi Sebastianowi Łaskawcowi z PayU za wsparcie merytoryczne w postaci prezentacji poprzedzającej, w której pojawiły się stara i wciąż dobra Java oraz narzędzia: Maven, serwery aplikacyjne Java EE z CDI / JPA / JSF (wzmiankowany był nawet IBM WebSphere!), IDEA, XML, Arquillian, które zostały wykorzystane jako pożywka dla moich dywagacji o łatwości “moich” narzędzi - sbt / activator.
  • Koledze Gaussowi za pomoc merytoryczną w wątku o Gaussie i sumie liczb od 1 do 99 oraz późniejszych spostrzeżeń o moim wystąpieniu.
  • Koledze od by -1, który wspomógł mnie merytorycznie, kiedy poszukiwałem rozwiązania do scalowej listy malejącej liczb naturalnych od 99 do 0.
  • Przemkowi i Renacie za przybycie z...ekhm...Bydgoszczy.
  • Michałowi Jaśtakowi @vardlokkur za przybycie i wzmocnienie grupy dawnych znajomych ze studiów na UMK.
  • Pani rekruterce-toruniance z Lufthansa z Gdańska, która cierpliwie odpowiadała na moje (lekko zaczepne) pytania o zatrudnienie w firmie (zachęcam do rozważenia oferty!)
  • Zbyszko Papierskiemu @ZPapierski za wprowadzenie do netfliksowego coś tam, i wyjaśnieniu zalet narzędzia w sposób tak ciekawy, że mimo moich zakus przejęcia mikrofonu, słuchałem z otwartymi ustami. Dobry z niego mówca!
  • ...i innym członkom Toruń JUG, których nie wspominam wyłącznie z powodu zauważalnie postępującej demencji starczej, która nie pozwoliła mi na spamiętanie wszystkich.
Spotkanie pozwoliło mi na podzielenie się własnymi doświadczeniami z sbt, Typesafe Activator, Akka (od strony sbt) oraz Play (również od strony sbt).


Podsumowując moje spotkanie jednym zdaniem, należy zapamiętać jedno zdanie, bodajże Zbyszka:

"Typesafe Activator jest tak samo narzędziem do szybkiego zestawienia projektu, jak i nauki programowania w języku Scala i Java."

W zamyśle tej prezentacji była demonstracja narzędzia sbt oraz activatora, co ma przełożyć się na liczbę osób “zarażonych” użyteczną prostotą obu narzędzi. Odnoszę wrażenie, że klimat spotkania zaszczepił chęć popróbowania się z nimi chociażby jako narzędzia nauki języka Scala. Wystarczy przecież zainstalować activator (bądź sbt, ale będę jednak upierał się przy activator) i odpalić polecenie activator console, aby wejść w powłokę Scala REPL.

Podczas spotkania omówiłem prostotę sbt, która przekłada się na łatwość użycia narzędzia do zarządzania projektami scalowymi, a w tym pojęcia projektu (już pusty katalog nim jest!), compile, test oraz reload.

Co później trafnie zauważono, w takim towarzystwie - prawie w pełni javowym - zabrakło informacji o współpracy sbt/activator z Apache Maven oraz użyciu sbt/activator do zarządzania projektami javowymi. W tym gronie obie cechy zdecydowanie zdeklasowałyby inne "feature killers”.

Liczność spotkania oceniam na poziomie 50 osób. Na moje pytanie, którym otwierałem spotkanie, o znajomość Scali, 5 osób podniosło rękę, co przy pytaniu o komercyjne użycie sprowadziło tę liczbę do…1 osoby (słownie: JEDNEJ osoby) - właściciela firmy codenger Przemysława Kisickiego @PrzemyslawK. Zachęcam do kontaktu z Przemkiem wszystkie osoby, które są zainteresowane wejściem w Scalę profesjonalnie, bo poszukiwani są do pracy w Toruniu przy ciekawym projekcie budowania platformy sprawdzającej umiejętności kandydata (ukłony dla firm konkurencyjnych devskiller i codility, które pojawiły się w dyskusji o cele biznesowe firmy Przemka).

Dla zwrócenia uwagi, wszyscy, bądź prawie wszyscy (za wyjątkiem skończonej ilości osób), to osoby pracujące lub co najmniej znające język Java. Miałem w ten sposób nieocenione pole do popisu, aby zachęcić ludzi do wejścia w Scalę na barkach narzędzi sbt i activator. Ufam, że misja zakończona sukcesem. Proszę o potwierdzenie/zaprzeczenie w komentarzach.

Po spotkaniu na wydziale przenieśliśmy się do knajpy Krajina Piva, gdzie kontynuowaliśmy dyskusję co dalej w Toruniu i okolicach, w których znalazło się miejsce dla rodzącego sie światka scalowego.

Dziękuję życzliwym duszyczkom za podzielenie się swoimi uwagami odnośnie zawartości merytorycznej mojego wystąpienia. Na tej bazie kolejne wystąpienia będą bardziej napakowane merytorycznie. Pro publico bono.

Spotkanie było nagrywane, więc zainteresowani przywołaniem historii, będą mieli okazję do poczynienia odpowiednich kroków już niebawem. Zachęcam do obejrzenia nagrania i podzielenia się uwagami o zawartości, szczególnie merytorycznej.

Dla spragnionych wiedzy scalowej, poniżej ściągawka do rozpoczęcia programowania w Scali przy akompaniamencie activator’a:

  1. Pobieramy narzędzie activator-minimal ze strony Typesafe i instalujemy w dowolnie wybranym katalogu. Nie zapomnij dodać ten katalog do PATH.
  2. Tworzenie aplikacji - activator new
    • możliwość wyboru nazwy projektu
    • możliwość wyboru szablonu projektu - domyślnie 4 szablony po dwa dla Scali i Javy
  3. Inne użyteczne polecenia
    • activator - powłoka poleceń narzędzia (podobnie jak cmd w Windows lub powłoka uniksowa)
    • activator --version - wersja programu uruchamiającego pełne środowisko activator
    • about - specyfikacja projektu - wersja sbt, Scala, rozszerzenia/wtyczki
    • console - wejście do środowiska Scala REPL, gdzie można uczyć się języka Scala oraz pisać aplikacje scalowe interaktywnie
    • run - uruchomienie aplikacji, np. aplikacji webowej w Play
    • test - uruchomienie testów w projekcie
    • ~ (tylda) - uruchomienie dowolnego polecenia poprzedzając go tyldą pozwala na ciągłe uruchamianie polecenia przy zmianie źródeł projektu, np. ~ test uruchamia testy przy każdorazowej zmianie źródeł projektu (bezcenne przy TDD) - mówi się, że "panny mdleją na widok tyldy".
    • reload - ponownie wczytuje konfigurację projektu po jej zmianie
  4. Konfiguracja projektu w pliku build.sbt
    • name - nazwa projektu
    • scalaVersion - wersja języka Scala, np. “2.10.4” lub “2.11.1”
    • libraryDependencies - lista zależności projektowych (z których projekt korzysta oferując swoje usługi)
p.s. Mówi się, że to nie ostatnie moje wystąpienie dla Toruń JUG o Scali. To jednak nie wcześniej jednak niż po wakacjach. Do zobaczenia!

05 czerwca 2014

Akka: hAkker garden w Krakowie fajną imprezą było - kopiowanie zalecane

0 komentarzy
I znowu Kraków...sigh.

Pamiętaj, że spotykamy się programując wspólnie w Scali w Krakowie, w tę sobotę, 7 czerwca w siedzibie Natka!

Nie tak dawno, bodaj trzy dni temu, ogłosiłem uruchomienie Krakowskie Scalania z Natek.pl, aby dokładnie wczoraj doświadczyć innej przyjemności - przyglądania się inicjatywie Akka: hAkker garden w Krakowie, którą zorganizowała ekipa Krakow Scala User Group! Kudos Panowie za inspirację. Już mi się marzy odpalenie podobnej inicjatywy w stolicy. Można się jej spodziewać...niebawem. Chętni pomóc proszę o kontakt na priv.

Za stronką wydarzenia Akka: hAkker garden:
Ostatnio developerzy Akki wyznaczyli parę prostych issues przeznaczonych dla społeczności. Spotkajmy się więc i naprawmy kilka z nich!
...
Podczas hackowania będzie można sięgnąć po pomoc via IRC do członka/ów akka teamu - reaktywność gwarantowana :-)
Co mnie najbardziej urzekło, to możliwość zdalnego uczestniczenia w spotkaniu, które dla mnie nabrało zdecydowanie międzymiastowy, a nawet międzynarodowy charakter (!) Międzymiastowy, bo pozwolił na wzięcie w nim udziału z dowolnego miejsca w Polsce, ba, nawet świata, a międzynarodowy ze względu na zdalny udział +Konrad Malawski, który założyłem, że siedzi gdzieś w akkowej mecce na północy.

Dzięki +Marcin Kubala za zwrócenie na to wydarzenie mojej uwagi na twitterze, co utwierdziło mnie w przekonaniu, że twitter właśnie do takich celów zdaje się być doskonały. Możnaby oczekiwać maila (dostaję ich tyle, że już nie wiem, od którego zacząć), SMSa (powiedzmy, że to bardzo niepożądany sposób, a i zapewne niewielu zna innych numery komórkowe) czy właśnie taką zaczepkę na twitterze (co z odpowiednio skonfigurowanym klientem na smartfonie daje możliwości przypominające ala SMSy). Dzięki jeszcze raz, Marcin.

I tak, po oporządzeniu młodego, o 20:15 zajrzałem na ich kanał #krakow-scala na IRCu. Przypomniały mi się stare, dobre czasy, kiedy używanie tej formy komunikacji było wszechobecne i na miejscu. Wiele grup, np. clojure, do tej pory z powodzeniem korzysta z takiej komunikacji i pamiętam, kiedy mając problem, wejście na ich kanał dawało odpowiedź wręcz natychmiastowo. Bezsprzecznie najlepszy sposób na utrzymanie nowicjusza przy nauce czegoś nowego, np. języka, kiedy...szukać pomocy rzecz trudna być. Trudno mi sobie wyobrazić lepszą formę komunikacji z ekspertami utrzymując, że czas jest kluczowy, co zwykle ma miejsce i właśnie w danym momencie zajmuję się tematem (możnaby jeszcze liczyć na wspomnianego twittera, przy właściwie dobranym otagowaniu, ale tu pojemność znakowa ogranicza, albo StackOverflow, quora czy reddit, gdzie można sobie pofolgować znakowo, ale odpowiedź napływa zwykle z większym opóźnieniem).

Niedługo jednak trwało moje szczęście wzięcia udziału w tym przedsięwzięciu, kiedy synek przybiegł mówiąc "Tata, spać idziemy!" i...obudziłem się przed północą. I pozostało mi jedynie opisać moje wrażenia w tym wpisie :-)

Myślę, że w hAkker garden warto poświęcić więcej czasu i życzę sobie, aby ta inicjatywa miała swoich naśladowców. Kto następny? Jaki projekt? Speak up and let others know!

Dziękuję +Konrad Malawski, +Rafał Pokrywka+Marcin Kubala, którzy przyczynili się do unaocznienia mi ważności tego typu inicjatyw. Sława i chwała (chwilowo) należy do Was ;-)

31 maja 2014

Krakowskie Scalania z Natek.pl w Krakowie 7 czerwca

0 komentarzy
Z nieukrywaną przyjemnością firma Natek oraz Jacek Laskowski mają zaszczyt zaprosić na krakowskie scalania w dniu 7 czerwca (sobota) w Krakowie, które tym samym po raz pierwszy zagości poza granicami Warszawy!

Spotkanie jest całkowicie bezpłatne. Wymagana jest jednak rejestracja, która dostępna jest pod adresem http://krakowskiescalanie.eventbrite.com. Nie zwlekaj. Zarejestruj się już dziś!

Celem projektu scalania oraz serii spotkań pod parasolem Warszawa Scala User Group jest nauka programowania w języku Scala przez rozwiązywanie krótkich zadań programistycznych w tym języku. "W grupie raźniej!" - mawiają, a praktyczne podejście do nauki języka Scala pozwala na skrócenie czasu na rozpoznanie języka. Dyskusje przed, w trakcie oraz po rozwiązaniu zadania są kluczowym elementem uczącym w tych spotkaniach. Uważamy, że możliwość porównywania rozwiązań i zasięgnięcie języka pozwalają na znaczne skrócenie czasu poznania Scali.

Co jest potrzebne, aby uczestniczyć w spotkaniu? Przynieś laptopa z zainstalowanym środowiskiem IntelliJ IDEA z wtyczką do Scali (lub Eclipse, NetBeans, czy inne IDE) oraz sbt 0.13.5. Zalecane (ale nie wymagane) jest wcześniejsze pobranie (git clone git@github.com:jaceklaskowski/scalania.git) projektu scalania i uruchomienie sbt test:update w katalogu projektu.

Podczas spotkania będziemy wspólnie poznawać język Scala przez grupowe rozwiązywanie krótkich zadań programistycznych (zestaw zadań S-99: Ninety-Nine Scala Problems, Scala Koans, ćwiczenia z książki "Functional Programming in Scala", ćwiczenia do szkolenia "Scala i programowanie funkcyjne") oraz implementacji metod ze Scala API znając wyłącznie ich nazwę i sygnaturę (a czasami jedynie sygnaturę).

Wsparcie sieciowe, lokalowe i żywnościowe zapewnia nam firma Natek.

Przyjdź i przekonaj się, jak doświadczenie prowadzącego zebrane przy organizacji serii podobnych spotkań w Warszawie oraz sama znajomość języka Scala przydadzą się Tobie w nauce. Jednym kosztem jest Twój czas, a dzięki temu spotkaniu możesz poświęcić go tylko tyle, ile faktycznie potrzebne.

Jest tylko 20 dostępnych miejsc i jedyna szansa na uzupełnienie wiedzy o Scali w tak miłej atmosferze! Nie zwlekaj z podjęciem decyzji i zarejestruj się już dziś!

Zapraszamy!

23 maja 2014

#StackOverflow, #twitter i #github na #javotok'u w @javeo_eu

0 komentarzy
Wprosiłem się na spotkanie w @javeo_eu i zawłaszczyłem czas antenowy tematem "#Be #social #FTW - #stackoverflow, #github, #twitter et al for professional #development".

Zależało mi najbardziej na zbudowaniu platformy otwartej wymiany opinii na temat korzystania z mediów społecznościowo-programistycznych dla własnych celów rozwojowych (przede wszystkim), które, przy pewnej wytrwałości w działaniu, wpływają również na postrzeganie pracodawcy delikwenta (pożądany skutek uboczny). Cieszę się, że się udało i w jednym miejscu zgromadziło się 13 osób, wśród których był właściciel/prezes, Magda od spraw HR/PR, juniorzy, seniorzy i pamiętający dawne czasy Javartu.

Pytanie wiodące było: Jak zbadać siłę merytoryczną zespołu?

Po raz pierwszy doświadczyłem olśnienia znaczenia pytań "Kto...?" podczas wystąpień publicznych, gdzie nie ma mowy o większej interakcji niż podniesienie ręki. Pytania kto? są swego rodzaju pytaniami czy? z tą jednak różnicą, że pierwsze kto? wymusza jedynie gest, a drugie werbalne wyrażenie zdania, co nie pozwala na jednoczesną rekację większej liczby osób, a dodatkowo wprowadza niepożądany hałas (przy grupie > 5 osób). Muszę jeszcze pamiętać, aby samemu wyrażać zdanie przez podniesienie ręki po lub w trakcie zadawania pytania. Ciekawa technika.

Możliwość odpalenia tej inicjatywy w zaprzyjaźnionej firmie javeo utrwaliła we mnie przekonanie o konieczności kontynuowania tego typu wymiany wiedzy - w budynku firmy, w dzień luźniejszy projektowo aka piątek i w ramach godzin pracy. Sądzę, że przy odpowiednim dopasowaniu godzinowym, np. godzina 10:30 i właściwej aranżacji miejsca spotkania - wyżywienie, napoje, okna ze słońcem na zewnątrz, wygodnymi pufo-fotelami, itp. - mogłoby sprawić ciekawy dodatek w życiu pracownika.

Spotkanie zaplanowane było na godzinę, ale jakimś przypadkiem przeciągnęło się do dwóch :) Bywa. Wybaczcie znudzeni i cieszcie się niespożyci kontynuacji tematu. Postarajmy się wspólnie następne spotkanie wpasować w gusta czasowe większej liczby uczestników. Z 13 osób zostało do końca 7, co przy konkurencji z dzisiejszym spotkaniem o MongoDB uważam za wynik bardzo dobry.

Mam nieodparte wrażenie, że w wyniku spotkania w javeo pojawi się kilka ciekawych inicjatyw rozwojowych, w których nie zabranie prelegentów na najbliższych konferencjach (ukłony dla Zbyszka) i nie będzie trzeba czegokolwiek redukować (ukłony dla Tomka i Przemka), chyba że korzystając z języka Scala wespół z map i filter (ukłony dla Grześka i Wojtka). Było ciekawie, a dla mnie największa nauka płynie taka, że kiedy oczekuje się dyskusji i się ją wznieciło, to należałoby odsunąć się po prostu w cień i słuchać, pozwalając na wymianę zdań między uczestnikami. Nie bez przyczyny mamy więcej narządów słuchu niż mowy! Do zapamiętania.

Dzięki za zaproszenie i niezwykle inspirującą dyskusję. Ciekawym opinii uczestników. Od jednego już mam, więc brakuje jeszcze 12. Nadsyłajcie hejty i lajki. W zamian obiecuję podobne reakcje :) Do następnego razu!

06 kwietnia 2014

O java.util.stream przez przykład(zik) z StackOverflow i Java 8 API

0 komentarzy
Istnieje wiele sposobów na poznanie nowego języka programowania i jednym z moich typów jest aktywność na StackOverflow. Można pokusić się na odpowiadanie na pytania (to stopień najwyższy wtajemniczenia), można “lajkować” (to stopień podstawowy), można edytować pytania i odpowiedzi uzupełniając je o dodatkowe informacje, które pozyskuje się z komentarzy czy wskazywać duplikaty (to stopień średniozaawansowany). Sprawdziło mi się to podczas nauki narzędzia sbt, więc kwiecień i kolejne kilka miesięcy zamierzam współdzielić z aktywnością w obszarze Java 8 (etykieta java-8 na StackOverflow).

W zależności od etykiety i dnia roboty może być na kilka minut aż do wielogodzinnej nasiadówy. Nie jest to zwykle łatwa robota początkowo, ale z czasem idzie coraz łatwiej, a i przyjemności coraz więcej. Aktywność dotyczy w równym stopniu pytań i odpowiedzi. Można również uzupełniać opisy etykiet.

Wszystkie aktywności na StackOverflow są nagradzane punktami reputacji, odznakami i wiedzą w temacie. W zasadzie brak wad.

O StackOverflow (i GitHub, twitterze oraz w promocji reddit) będę mówił podczas mojej prezentacji StackOverflow, GitHub i twitter jako narzędzia profesjonalnego rozwoju programisty na DevCrowd’14. Gorąco zachęcam do udziału.

Wróćmy jednak do nauki nowej wersji Java 8.

Kiedy dzisiaj do mojej skrzynki trafiło zestawienie pytań z etykiety java-8 było w nim tylko jedno pytanie - How to dynamically do filtering in Java 8?. Niefortunnie, nie należy ono do najbardziej pouczających, ale odpowiedź już tak. Stuart Marks, który jest autorem odpowiedzi, postarał się o sporą dawkę wiedzy nt. lambd i "pochodnych" w Java 8. Zdecydowanie warto zapoznać się z odpowiedzią.

Weźmy chociażby "This can't be done with a simple filter(predicate) construct on a stream.”

java.util.Collection<E> jest podstawowym interfejsem w kolekcjach w Javie (od momentu pojawienia się ich, już w Java 1.2!). Dotyczy to struktur danych takich jak zbiory, listy, kolejki i mapy.

Zmianą w Java 8 jest dodanie m.in. metody default Stream<E> stream(), która wprowadza nas w świat strumieni. Kolekcja, na której wywołamy stream(), będzie źródłem danych.
Stream<Integer> ints = Arrays.asList(1,2,3).stream();
Mając Stream jesteśmy w domu. Drzwi “streamowe” otwarte.

Wezmę na tapetę pierwszą metodę z tercetu funkcyjnego - filter (obok map i reduce). Jej sygnatura to filter(Predicate predicate)
ints.filter(...)
Niestety moja wiedza dotycząca wartości przekazywanej do filter jest znikoma, bo pojawia się kolejna klasa z Java 8 - java.util.function.Predicate. Warto zajrzeć do javadoc, w którym napisano:

"This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.”

Jakaś masakra! :) Kompletnie mi to nic nie mówi. Intelekt i wdzięk podpowiadają mi jednak, że gdzieś tam pojawiały się konstrukcje w stylu argument(y) -> ciało funkcji. To właśnie nazywają lambdą (a przynajmniej takie mam wyobrażenie jak taka lambda mogłaby wyglądać mając pewne doświadczenie w innych językach funkcyjnych - Clojure, Scala, F#).

Sprawdzam taką konstrukcję.
Stream<Integer> oddInts = ints.filter(n -> n % 2 != 0);
Powinienem otrzymać strumień liczb nieparzystych. Wciąż to jednak wyłącznie strumień i próba System.out.println na tym zwróci jedynie tekstową reprezentację referencji.
java.util.stream.ReferencePipeline$2@682a0b20
Pora zmaterializować strumień do strawniejszej postaci, np. wyświetlę wszystkie elementy strumienia.

Z pomocą przychodzi mi IntelliJ IDEA. Wystarczy napisać oddInts.forEach i wcisnąć Ctrl+Shift+Spacja, aby pojawiła się jedyna słuszna podpowiedź - o -> {}. I to jest dokładnie to, czego potrzebuję - mam wybór, ale zbiór niezbyt liczny, bo jednego elementu. Próbuję wypisać elementy na ekran z System.out.println.
oddInts.forEach(o -> System.out.println(o));
Ctrl+Shift+F10 w IntelliJ IDEA i dostaję na ekranie wynik:
1
3
Dokładnie taki, jaki oczekiwałem!

Ale to nie koniec. IntelliJ IDEA nie poprzestaje i podpowiada, że warto zamienić tę konstrukcję na...method reference. Nie mam pojęcia, o co chodzi, ale podążam za głosem IDEA. Alt+Enter i już jest.
oddInts.forEach(System.out::println);
Taki sposób nauki lubię. Chciałbym mieć jeszcze możliwość poznawania Java 8 API w środowisku REPL (na wzór Scali, F#, Clojure czy Groovy), ale to raczej pieśń przyszłości. Dobrze, że mam IntelliJ IDEA!

Pełna klasa gotowa do uruchomienia:
package pl.japila.java8;

import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> ints = Arrays.asList(1, 2, 3).stream();
        Stream<Integer> oddInts = ints.filter(n -> n % 2 != 0);
        oddInts.forEach(System.out::println);
    }
}
A jak Tobie idzie poznawanie Java 8 API? Chętnie posłucham rad bardziej wytrwałych, którzy pierwsze dni mają już dawno za sobą.

30 marca 2014

Java Platform, Standard Edition 8 wydane, więc nauki czas ponownie zacząć, co?

0 komentarzy
Java Platform, Standard Edition 8 (w skrócie Java SE 8 czy po prostu Java 8) jest już powszechnie dostępne. Wiele się zmieniło i pewnie nie tylko ja chciałbym wiedzieć, na ile Java 8 jest warta poznania, po tym, kiedy zarzucono ją na rzecz innych języków programowania - Clojure, Scala, Groovy. Ty też chciał(a)byś wiedzieć, co się zmieniło w najnowszej wersji Java 8? Najlepiej zacząć prosto u źródła - JDK 8 Release Notes lub What's New in JDK 8. Jest tego sporo do czytania, co może świadczyć o niemałych zmianach i dłużej nauce. Taka nasza informatyczna dola...

Pierwsza ciekawostka dla mnie to nazewnictwo - Java SE 8 vs JDK 8. Nie było to tak oczywiste, bo Java SE 8 to specyfikacja, a JDK 8 jej implementacją od Oracle. Jakoś wcześniej mi to umykało. Tak przynajmniej napisano w dokumentacji.

Mówi się, że najlepszym sposobem na naukę nowego języka jest po prostu korzystać z niego. Dotyczy to języka mówionego i dobrze sprawdza się również z językiem programowania. W ten sposób właśnie zamierzam poznać Java 8. Na swoim blogu proponuję pracę z IntelliJ IDEA 13. Właśnie kilka dni temu wyszła wersja 13.1.1 i wystarczy pobrać bezpłatną wersję Community Edition.

Przy założeniu, że Java 8 została zainstalowana, w IDEA wybierasz Create New Project, a później Java, wciskasz Next, aż pojawi się panel, w którym po raz pierwszy wybieramy Java 8 jako środowisko pracy.


Po stworzeniu projektu, upewnij się, że Project language level ustawiony jest na 8.0 - Lambdas, type annotations, etc.


Mając projekt można zacząć rozpoznawać Java 8 API. Od czego zaczniemy? Może java.util.stream?! A nie inaczej, skoro jest to (wraz z lambdami) jedna z ważniejszych zmian w tej wersji języka.

Za Collections Framework Enhancements in Java SE 8:

"Classes in the new java.util.stream package provide a Stream API to support functional-style operations on streams of elements. The Stream API is integrated into the Collections API, which enables bulk operations on collections, such as sequential or parallel map-reduce transformations."

Zaczniemy właśnie od Stream API, bo rozpoznając ten kawałek Java 8 nie sposób nie dotknąć innych zmian jak chociażby wspomniane lambdy.

Przez Collections Framework Enhancements in Java SE 8 dochodzimy do…i tu znowu cała masa dokumentacji. Zachęcam do lektury New and Enhanced APIs That Take Advantage of Lambda Expressions and Streams in Java SE 8.

Na tej stronie można doświadczyć pierwszego spotkania ze zmianami w Java 8:
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List listOfIntegers =
    new ArrayList<>(Arrays.asList(intArray));
    System.out.println("Sum of integers: " +
        listOfIntegers
            .stream()
            .reduce(Integer::sum).get());
Zacznijmy od tego kawałka.

Na początku rzuciło mi się, dlaczego new ArrayList<>(Arrays.asList(intArray)) zamiast po prostu Arrays.asList(intArray)? Pewnie jakaś ukryta wiedza magiczna.

Dla adeptów Java 8 nową metodą w java.util.List<t>, a dokładniej java.util.Collection jest default Stream stream(), który (za javadoc):

"Returns a sequential Stream with this collection as its source."

  1. Po pierwsze, co oznacza default przy sygnaturze?
  2. Po drugie, czym jest Stream?
  3. Po trzecie, skoro stream() zwraca “a sequential Stream”, to czy istnieje inny rodzaj Stream, np. non-sequential?
Wrócimy do tego niebawem.