• 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

Cloud VPS
0 głosów
277 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,260 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,260 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ź 512 wizyt
pytanie zadane 3 września 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 21 lutego 2022 w Java przez matrasek15 Nowicjusz (120 p.)
+1 głos
0 odpowiedzi 155 wizyt
pytanie zadane 19 czerwca 2019 w Java przez Steady Obywatel (1,200 p.)

93,487 zapytań

142,420 odpowiedzi

322,772 komentarzy

62,903 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

Kursy INF.02 i INF.03
...