Wpis z mikrobloga

Mirki z #programowanie oraz #programowaniefunkcyjne (tutaj nieco mniej obserwujących ;) ). Pomyślałem, że może wam się spodobają treści na moim aktualnym blogu. W dzisiejszym odcinku opisałem do czego służy Optional w Javie 8. Ogólnie zamieszczam i zamierzam zamieszczać treści związane z programowaniem, programowaniem funkcyjnym, #scala, #java i co innego ciekawego przyjdzie mi do głowy :)

Link do aktualnego posta: http://blog.radoszewski.pl/programming/java/2015/04/19/java-optional.html

Miłego czytania!

Ach, zapomniałem wspomnieć, że czytanie odbywa się w języku angielskim!

#autoreklama
  • 17
@archlinuxuser: No scala do najprostszych nie należy i to jest chyba jej największy problem ( ͡° ʖ̯ ͡°). Ja długo nie mogłem patrzeć na scalę, ze względu na to jak wyglądała i dlatego, że próg wejścia był dość wysoki. Jakoś to jednak przebolałem i teraz strasznie trudno mi pogodzić się z Javą, która w porównaniu wygląda jak narzędzie z kamienia i patyka ;)

Tak czy inaczej, skoro
@moriturius: Trochę faila zaliczyłeś. Trochę bez sensu moim zdaniem pisać o czymś co się słabo ogarnia.

Czemu nie po prostu .map? flatMap generalnie używa się do czegoś zupełnie innego. Przykłady też słabe bo nie uciekasz od nulla (nadal w obrębie klasy używasz nulla i ofNullable), dodatkowo Book::getAuthor nie jest skrótem od book -> book.getAuthor(), "Optional" wcale nie jest "underestimated" tylko szumu o tym jest pełno, flatMap wcale nie jest "most used
@hbpitero: No faktycznie nie powinno się pisać o czymś co się słabo ogarnia :)

Gdybym użył .map zamiast .flatMap dostałbym w wyniku Optional> - nie do końca o to chodziło. Byłbym też wdzięczny gdybyś mi wytłumaczył do czego się .flatMap używa :)

Przykłady też słabe bo nie uciekasz od nulla (nadal w obrębie klasy używasz nulla i ofNullable)


Masz rację, ale używanie nulla w jakimś zamkniętym kontekście to zupełnie coś innego
@moriturius: Masz rację, więc tak na szybko

Musiałeś coś pomieszać w swoim kodzie, gdyż map z Optional nie dbędzie wymagać funkcji mapującej Optional na X tylko T na X, więc sytuacji z Optional> by tutaj nie było. Możemy najzwyczajniej mapować w najzwyklejszy sposób zapominając o optionalach:

book.map(Book::getAuthor).map(Author::getName).map(String::trim).map(Stirng::length).forEach(System.out::println);

Więc nie musimy uciekać z optionala poprzez .get() itp. jest on automatycznie "unwrapowany".

flatMap działa analogicznie ale właśnie jak się domyślasz, gdy mamy pozagnieżdżane
Musiałeś coś pomieszać w swoim kodzie


Proponuję nie odpisywać jednak "na szybko" tylko sprawdzić swoją wiedzę i kontekst. W moich przykładach wszystkie gettery zwracają Optional. W takim układzie:

book.map(Book::getAuthor).map(Author::getName)

się nie skompiluje. A to dlatego, że jeśli getAuthor zwraca Optional to użycie prostej funkcji map sprawi, że otrzymasz Optional>. Jeśli chcesz się o to kłócić to przynajmniej najpierw napisz jakiś kod, który się skompiluje i uruchomi. Nic tutaj nie jest
@moriturius: Faktycznie mnie zaskoczyłeś, najbadziej z nie-leniwym wywołaniem map.

Nie mniej nie "promowałbym" getterów setterów i flatMap w taki sposób. A już w szczególności, aby gettery i settery zwracały inny typ niż typ atrybutu.