2016-02-11 14 views
14

Byłem zaskoczony metodą Optional.ofNullable. Pewnego dnia napisałem funkcję, która powinna zwracać opcjonalny:Opcjonalne.Nałożenie i metoda łańcuchowa

private Optional<Integer> extractFirstValueFrom(InsightsResponse insight) { 
    return Optional.ofNullable(insight.getValues().get(0).getValue()); 
} 

ja błędnie myśli, że Optional.ofNullable zapobiegnie NullPointerExceptions wewnątrz wyrazu argumentów.

Teraz myślę, że wiem, że to był bardzo głupi pomysł. Java musi najpierw rozwiązać argumenty, aby przekazać je do wywołania Optional.ofNullable.

Ale mam pytanie. Czy istnieje dobry i dobry sposób na osiągnięcie mojego celu? Chciałbym uzyskać od wyrażenia insight.getValues().get(0).getValue() niektóre wartości Integer lub null. Null może być każdym z wyrażeń: insight.getValues() lub insight.getValues().get(0).

Wiem, że mogę to umieścić w bloku prób/catch, ale zastanawiam się, czy istnieje bardziej eleganckie rozwiązanie.

+0

W twoim przypadku "wgląd" ma wartość null. Znacznie lepiej jest nigdy nie przekazywać wartości null do metod, niż sprawdzać, czy wewnątrz metody nie występują. –

Odpowiedz

20

Jeśli nie masz pojęcia, co może być null, lub chcesz sprawdzić wszystko na null, jedynym sposobem jest do połączeń łańcuchowych do Optional.map:

Jeśli wartość nie jest obecne, stosuje się podaną funkcję mapowania it, a jeśli wynik nie jest pusty, zwróć Opcjonalny opis wyniku. W przeciwnym razie zwróć puste Opcjonalne.

jako takie, o ile zwrot odwzorowujący null będzie zwrócony Optional puste, co pozwala na połączenia w łańcuchu.

Optional.ofNullable(insight) 
     .map(i -> i.getValues()) 
     .map(values -> values.get(0)) 
     .map(v -> v.getValue()) 
     .orElse(0); 

Ostateczne wezwanie do orElse(0) pozwala przywrócić domyślną wartość 0, jeśli każdy element odwzorowujący powrócił null.

2

smth jak to powinno działać

Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue()) 

dobrze, zgodnie z przykładowym kodem danej, jak #extractFirstValueFrom nie zawierają ani @Nullable ani kontrole na zerową jak guawa na checkNotNull() załóżmy, że insight jest zawsze something. w ten sposób zawijanie Optional.ofNullable(insight.getValues()) do Option nie będzie skutkować NPE. następnie tworzony jest łańcuch wywołań transformacji (każdy z nich to Optional), który prowadzi do wyniku Optional<Integer>, który może być Some lub None.