• 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

VPS Starter Arubacloud
0 głosów
167 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ź 440 wizyt
pytanie zadane 3 września 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
1 odpowiedź 76 wizyt
pytanie zadane 21 lutego 2022 w Java przez matrasek15 Nowicjusz (120 p.)
+1 głos
0 odpowiedzi 92 wizyt
pytanie zadane 19 czerwca 2019 w Java przez Steady Obywatel (1,140 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...