Mały lifting funkcji

Na początek małe wprowadzenie teoretyczne. Istnieją funkcje, których dziedzina jest w jakiś sposób ograniczona do pod zbioru obiektów należących do danego typu. Najlepszym przykładem jest dzielenie (dla uproszczenia liczb całkowitych), które działa o ile dzielnik nie jest zerem. Wynik takiej operacji jest nieokreślony, albo najzwyczajniej błędny. Jeżeli przenosimy taką funkcję do kodu to możemy: Stworzyć […]

Naprawianie Javy 8 – krotki

Java 8 dała nam wiele wspaniałych rzeczy. Jednak nadal nie dostarczyła nam API krotek (ang. tuples). Z pomocą przychodzą oczywiście różne biblioteki. Chociażby JavaTuples, którą należy już nazywać Java Truples, bo nie była aktualizowana od dawien dawna. Choć ostatnio dorzucili… konfigurację OSGi. Inną biblioteką jest osławiony Javaslang. Zobaczmy co można z jej pomocą uzyskać. Tworzenie […]

Statystyka gry

By zachować funkcjonalność pierwotnej wersji Lotto, musimy teraz stworzyć jakiś mechanizm, który: Wykona N losowań. Zsumuje (jakoś) ile razy w wypadła dana kula. Wyświetli wyniki. Pierwszy jest stosunkowo prosty, a trzeci też nie odstaje od reszty. Drugi wymaga jednak dużej uwagi. We wczorajszym wpisie wspomniałem, że jednym z problemów w testowaniu oryginalnego kodu jest, sprawdzenie […]

To jak w końcu wyświetlić obiekt bez gettera?

Jedna z zasad ekstremalnej obiektowości głosi, że klasy nie powinny mieć getterów i setterów. Jest to oczywiste, jeżeli weźmiemy pod uwagę zasadę hermetyzacjiW, która mówi, że powinniśmy nie ujawniać informacji zawartych w klasie. A czymże jest getter jak nie ujawnieniem takiej informacji, w dodatku czym różni się od publicznego pola? W naszej przygodzie z lottomatem […]

Po co nam typy?

Kto śledzi mojego bloga, ten czytał o tym, jak można wykorzystać typy i mechanizmy generyczne, by już na poziomie kompilacji wyłapać potencjalne błędy w kodzie. W ostatnim czasie na przykład tu: Sztuczki z typami generycznymi Kolekcje niepuste Dwa słowa o typach własnych (to trochę starsze) Jako że tym tygodniu bawimy się z Lotto, to pobawmy […]

O elegancji kodu

W tym tygodniu będziemy pracować z kodem ze wczorajszego posta. O co chodzi? Wczorajszy post powstał na szybko, bo Mati miał urodziny i nie miałem czasu się rozpisywać. Jednak już na pierwszy rzut oka wiadomo, że kod tak napisany, choć spełnia założenia tzn. wypisuje szansę wylosowania danej kuli w totka, nie jest dobry. Jest stosunkowo […]

Idiomy z Java 8 III

Na początek cytat z lekcji o testach ze strony Elixir School: If you follow good design principles the resulting code will be easy to test as individual components. Fajna sprawa, bo jak patrzę na aplikacje, które pisałem to wszędzie tam prędzej czy później powstawały testy, które zaczynały się litanią mocków, albo co gorsze same testy […]

Jak napisać takeWhile w Javie 8

W Javie 9 będzie to dostępne od ręki, ale w ósemce trzeba się trochę nagimnastykować. O co dokładnie chodzi? Przyjrzyjmy się prostemu programowi: Listing 1. Przykładowy program public class App { public static void main(String[] args) { Scanner console = new Scanner(System.in); Stream.generate(() -> console.nextLine()) .limit(10) .forEach(System.out::println); } } Czytamy wartość z konsoli i wypisujemy […]

Czy da się pisać kod bez jawnego używania if?

Odpowiedź brzmi da się. To oczywiste. Mając do dyspozycji mechanizmy w rodzaju filter i map oraz przeciążając metody tak by to kompilator decydował co wywołać na podstawie typu można napisać kod bez użycia if. Takie pisanie kodu już kiedyś omawiałem. Tam skupiliśmy się na eliminacji else. Dziś pokażę gdzie warto pozbywać się if-ów i jak […]

Idiomy z Java 8 II

Dziś kolejny zestaw idiomów. Tym razem dwa wyrażenia, które zazwyczaj demonstruje się na prezentacjach poświęconych możliwościom jakie dają Streamy. Związane są one z przetwarzaniem kolekcji. Listing 1. Klasyczny kod public Collection<MyOtherEntity> filterMapCollect(Collection<MyEntity> myEntities){ Lists<MyOtherEntity> others = new ArrayList<>(); for(MyEntity my: myEntities){ if(my.matchToSomeCondition()){ others.add(convertToOther(my)); } } return others; } public Collection<MyOtherEntity> mapFilterCollect(Collection<MyEntity> myEntities){ Lists<MyOtherEntity> others = […]