Ignorowanie parametru z Consumer

Ignorowanie parametru z Consumer
EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0

Nie bardzo wiem jak miałbym opisać moje pytanie więc posłuże się przykładem. Mamy np. metodę która pobiera użytkownikaz bazy i zwraca Optional:

Kopiuj
    Optional<User> getById(String id);

I teraz chciałbym pobrać użytkownika z bazy na podstawie np. ID, a jeśli taki istnieje to chciałbym wykonać jakąś akcje niezwiązaną z tym obiektem. Mogę wówczas zrobić w ten sposób:

Kopiuj
   if (repository.getById(id).isPresent()) {
          doSomething()
   }

ale jest to jak wiadomo bardzo słabe rozwiązanie. Innym może być takie:

Kopiuj
   repository.getById(id).ifPresent(user -> doSomething());

I to jest niby lepsze ale z drugiej strony parametr usera jest tu ignorowany. Czy w waszym kodzie jest to do przyjęcia czy raczej świadczy to o jakichś błędach w logice?

EDIT:
Tak sobie trochę pogooglowałem i wysło na to że coś takiego zadziała:

Kopiuj
   repository.getById(id).ifPresent(__-> doSomething());

Osobiście sie z tym w kodzie nie spotkałem więc w sumie nie mam zdania na ile to jest poprawne podejście chociaz w Kotlinie też jest podobne rozwiązanie z tym że uzywany jest pojedynczy znak.

edytowany 3x, ostatnio: eL
CountZero
  • Rejestracja:prawie 8 lat
  • Ostatnio:11 miesięcy
  • Postów:262
1

W tym przypadku co podałeś to prędzej bym zrobił metodę na bazie:

Kopiuj
boolean exists(String userId);

W innych przypadkach to trudno powiedzieć, skłaniałbym się raczej do tego, że coś jest nie tak.

EL
Racja, przykład może nie jest idealnie trafiony bo exist byłoby zdecydowanie lepsze ale chodziło mi bardziej o zobrazowanie problemu.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
3

Takie ignorowanie jest zupełnie normalne.
Im bardziej skręcasz w stronę "pure code" tym częsciej się pojawia. (Szczególnie w miejscach gdzie funkcyjnie zapisujemy kod imperatywny).

Samego ifPresent nie lubię (bo to void) ale nieważne w co opakujesz i tak problem tych ignorowanych parametrów pozostanie.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
EL
Zgadzam się co do słabości ifPresent dlatego zamiast Optionala z Javy preferuje Option z Vavra.
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Samego ifPresent nie lubię (bo to void)

Że lepszy byłby jakiś peek zwracający ten sam obiekt?


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Charles_Ray
Tak i w peeku efekt uboczny :) bardzo czytelne :)
S9
Ja nie powiedziałem że ja bym tak zrobił.
Charles_Ray
Ja nie napisałem, ze tak byś zrobił :) zgadzam się, ze ten ifPresent jest taki... jak całe programowanie funkcyjne w Javie. :)
S9
No ale z drugiej strony zawsze musisz mieć gdzies ten efekt uboczny upchnąć, ja tam nie widze nic złego w ifPresent
S9
Te rozmawianie o ifPresent przypomina troche dyskusje o enkapsulacji przez settery i gettery :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.