Functional Programming in Scala – pozycja obowiązkowa

Tytuł:Functional Programming in Scala Autor:Paul Chiusano i Rúnar Bjarnason Rok:2014 ISBN:978-16-17290-65-7 Dziś trochę nie technicznie, bo wiadomo święta i nie ma czasu. Książka Runara Bjarnasona i Paula Chiusano to jedna z tych książek, które trzeba przeczytać. Poświęcona programowaniu funkcyjnemu w Scali jest jednocześnie świetnym wstępem do programowania funkcyjnego w ogóle. Podzielona na cztery części, które […]

Masakra Javy wyjątkową monadą

Wraz z wejściem Javy 8 i jej funkcyjnych elementów otrzymaliśmy też możliwość pobawienia się monadami. Monada to jest takie „coś” pochodzące z teorii kategorii co spełnia pewne prawa (definicja przez spejsonizację). Nie chcę tu wnikać w szczegóły, bo zarówno wiki jak i różne artykuły po sieci rozsiane tłumaczą co i jak. W świecie Javy sprowadza się […]

Co, gdzie, kiedy – czyli przykład refaktoryzacji w kierunku FP.

Dziś na warsztat idzie przykład refaktoryzacji, który nazywam „Co, gdzie, kiedy”. Nazwa nie jest przypadkowa, ponieważ celem jest takie przekształcenie kodu imperatywnego by jak najmocniej odseparować od siebie trzy elementy, które są stałe przy pracy z kolekcjami. Co Pierwszy element to określenie co chcemy zrobić. Zazwyczaj chodzi o weryfikację jakiegoś warunku albo o dokonanie obliczeń […]

Złe pomysły to czasami jedyne pomysły

Guava w swojej funkcyjnej odsłonie jest opłacalna jedynie tam gdzie nie mamy do dyspozycji Javy 8. W tym starciu Guava jest bezbronna ponieważ ma uboższe API i nie ma w nim wielu podstawowych elementów np. konsumentów. Co prawda można ich dopisać, ale to zawsze jest jakiś hak. Innym, nowym, elementem wprowadzonym w Javie 8, który […]

Funkcje w Guavie i dekoratory

Najprostszy do zaimplementowania wzorzec obiektowy, poza singletonem, w programowaniu z użyciem Function i Guavy, czyli dekorator. Dlaczego najprostszy? Ponieważ jest to podstawa działania funkcji wyższego rzędu (ang. High Order Function), które znowuż są podstawą tworzenia trochę bardziej zaawansowanych zabawek. Motywacja klasycznym przykładem dekoratora jest budowanie GUI gdzie kolejne elementy staramy się „udekorować” pewnymi dodatkami. W […]

Suplement do Suppliera

Na ostatnim spotkaniu wrocławskiego JUGa padło pytanie co do Suppliera z poprzedniego wpisu dotyczące tego jak należy zamykać BufferedReader. Trochę się niestety zamotałem i nie byłem wstanie udzielić dobrej odpowiedzi na to pytanie, ale po spokojnym przemyśleniu sprawy rzecz jest bardziej niż prosta. Błogosławione niech będą rzeczy nowe w Javie 7 Dokładnie zaś konstrukcja try-with-resource, […]

Supplier z Guavy jako narzędzie odczytu plików

Interfejs Supplier opisałem już pewien czas temu. Dziś chciałbym przedstawić pewne specyficzne zastosowanie tego interfejsu. Mianowicie stworzymy klasę, która będzie w oparciu o ten interfejs odczytywać pliki. Prawie leniwe czytanie plików Generalnie w Javie da się czytać pliki w sposób leniwy. Bierzemy sobie BufferedReader i wpinamy go w jakiś listener. Następnie uderzamy zdarzeniem „następna linia” […]

Funkcja niezmieniająca i konsumenci w Guavie

W poprzednim wpisie poświęconym Guavie wspomniałem, że przyjrzymy się sprawie wywołania loggera w naszym if-potworku. Listing 1. If-potworek for (ReportRunHistory reportRunHistory : reportRunsHistory) { LOG.info(reportRunHistory.toString()); if (reportRunHistory.status.equals(CANCELED.getStatusText()) || reportRunHistory.status.equals(FAILED.getStatusText()) || reportRunHistory.status.equals(COMPLETED.getStatusText())){ // … } } Sprawę ifów mamy już rozwiązaną. Czas przyjrzeć się temu co można zrobić z pierwszą linijką. Tak naprawdę to co tu […]

Predykaty z Guavy i enumy, czyli praktyki dwa łyki

Mamy sobie taki sprytny inaczej system uruchamiania raportów w innym systemie, gdzie z jednej strony mamy status raportu jako enum, a z drugiej jako String. Klasyczny przypadek prowadzący do „potworkowania” kodu takimi oto ifami: Listing 1. If-potworek for (ReportRunHistory reportRunHistory : reportRunsHistory) { LOG.info(reportRunHistory.toString()); if (reportRunHistory.status.equals(CANCELED.getStatusText()) || reportRunHistory.status.equals(FAILED.getStatusText()) || reportRunHistory.status.equals(COMPLETED.getStatusText())){ // … } } Tomek […]