• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java Stream API -> Optional<String> get

Object Storage Arubacloud
0 głosów
170 wizyt
pytanie zadane 16 maja 2020 w Java przez aram100 Użytkownik (500 p.)

Hej

Ćwiczę sobie stream API z Javy.

Wymyśliłem sobie taki zadanie - mam listę Pracowników (Klasa Employee ma pola: String name, String surname, LocalDate birthDate, boolean hired, boolean male, Position position, private int salary) - ale to nie ważne (chodzi tylko o podgląd klasy.)

 

W tej liście jest kilkanaście osób. Chciałbym za pomocą API stream wyciągnąć imię kobiety, która ma największą pensję w firmie. Oto moje rozwiązanie:

 

String maxSalaryWomanName = employeeList.stream()
        .filter(employee -> !employee.isMale())
        .max(Comparator.comparing(Employee::getSalary))
        .map(Employee::getName)
        .get();

 

Jest ok, ale Intellij podkreśla że użycie get() z opcjonala [jak nie ma żadnej kobiety to jest wyjątek:/ ], bez sprawdzenia isPresent(). Można zrobić to jakoś lepiej? Staram się oglądać sporo przykładów z tego streamApi, bo czasem fajnie się przydaje do działań na kolekcjach, ale trochę nie rozumiem tych bardziej zaawansowanych "zapytań".

1
komentarz 16 maja 2020 przez Aisekai Nałogowiec (42,190 p.)
To zależy. Co chcesz zrobić z tą osobą która ma najwięcej pieniędzy?

3 odpowiedzi

+1 głos
odpowiedź 16 maja 2020 przez Aisekai Nałogowiec (42,190 p.)

Wszystko zależy od tego, do czego Ci byłoby potrzebny rezultat streamu. W dokumentacji masz kilka metod które mógłbyś użyć, w zależności od zastosowania. 

W przypadku gdy nieznalezienie obiektu, np. podczas pobieranie obiektu z bazy danych w celu jego zmiany możesz zastosować orElseThrow - fakt, nie jest to do końca poprawne zastosowanie wyjątków, poczytaj o "coding by exception". 

W przypadku gdy możesz zastosować jakąś defaultową wartość możesz wykorzystać metodę: orElseGet().Ze względu na to, że Java nie wspiera możliwości zwracania kilku rezultatów (jak np. Go), możesz też to wykorzystać tworząc jakąś klasę która wrappuje dwa obiekty: Error i Obiekt (albo wykorzystać vavrowy Either), a następnie w getOrDefault() zwrócić jakiś obiekt zawierający kod błędu. 

Na upartego, możesz też zastosować ifa z isPresent() ale lepiej zastosować którąś z wcześniej wspomnianych metod - bardziej funkcyjne podejście.

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

komentarz 16 maja 2020 przez mbabane Szeryf (79,280 p.)

"coding by exception"

Masz może jakieś sprawdzone artykuły/ksiązki? 

komentarz 17 maja 2020 przez Aisekai Nałogowiec (42,190 p.)

Wszystko to, co da się znaleźć np. w Google pod frazą "Coding by exception" czy "Exception Driven Development". Fakt, dużo z tych artykułów jest dość starych, ale imo dalej powinny być aktualne - tutaj np. jest dyskusja pod jednym z postów na https://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why . 

Czy jest to sprawdzone? Nie wiem, ale według mnie, patrząc na argumenty przytoczone w wątku - dużo racji w tym jest, że nie powinno się stosować wyjątków w ten sposób.

0 głosów
odpowiedź 16 maja 2020 przez miro Pasjonat (23,870 p.)
edycja 16 maja 2020 przez miro
Wg. mnie to powinieneś owrapować zmienną w optional Optional<String> maxSalaryWomanName. Dalej w kodzie używając tej zmiennej możesz korzystać z ifPresent lub (jak pozwoli werssja Javy) ifPresentOrElse. Jak dopuszczasz sytuacje w której przypisujesz wartość domyślną to skorzystaj z orElseGet/orElse.
Unikaj używania get() na optionalu.
0 głosów
odpowiedź 16 maja 2020 przez mbabane Szeryf (79,280 p.)

Jeśli chcesz to tylko wyświetlić w konsoli to tak będzie najprościej:

employeeList.stream()
        .filter(employee -> !employee.isMale())
        .max(Comparator.comparing(Employee::getSalary))
        .map(Employee::getName)
        .ifPresent(System.out::println);

 

Podobne pytania

0 głosów
1 odpowiedź 444 wizyt
pytanie zadane 3 września 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
1 odpowiedź 77 wizyt
pytanie zadane 21 lutego 2022 w Java przez matrasek15 Nowicjusz (120 p.)
+1 głos
0 odpowiedzi 95 wizyt
pytanie zadane 19 czerwca 2019 w Java przez Steady Obywatel (1,140 p.)

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...