2016-05-04 15 views
6

Mam obiekt opcjonalny java, który chcę tylko uzyskać, jeśli jest obecny. Oczywistym jest kod tutaj:Opcjonalnie Java Get if Present

JsonGenerator gen; 
if(value.isPresent()) { 
    gen.writeObject(value.get()); 
} 

Ale chcę zobaczyć, czy mogę steamline że do 1 linii metodą ifPresent. Nie chcę, żeby to było w ogóle, jeśli nie jest obecne. Próbowałem czegoś takiego:

gen.writeObject(value.ifPresent(a -> a)); 

Ale to najwyraźniej nie zadziałało. Czy jest jakiś sposób, aby zrobić to, co chcę? Wszystko, co badałem online, pokazuje tylko użycie ifPresent z wywołaniem metody dla predykatu.

Edit 1: Próbowałem rozwiązanie Tunaki, ale otrzymuję następujący błąd:

Error:(25, 46) java: incompatible thrown types java.io.IOException in method reference 

Oto mój cały blok kodu:

public class FooSerializer extends JsonSerializer<Foo> { 
    @Override 
    public void serialize(Foo value, 
          JsonGenerator gen, 
          SerializerProvider serializers) throws IOException { 
     value.getFooA().ifPresent(gen::writeObject); 
    } 
} 

Próbowałem nawet:

public class FooSerializer extends JsonSerializer<Foo> { 
    @Override 
    public void serialize(Foo value, 
          JsonGenerator gen, 
          SerializerProvider serializers) throws IOException { 
     try { 
      value.getContactInfo().ifPresent(gen::writeObject); 
     } catch(IOException e) { 
      throw new UncheckedIOException(e); 
     } 
    } 
} 

Ale nadal daje mi to błąd.

Odpowiedz

14

Można powołać gen.writeObject jako konsument swojego obiektu w ifPresent:

value.ifPresent(gen::writeObject); 

To wywoła metodę tylko wtedy, gdy Optional nie jest pusta.

W tym przykładzie metoda writeObject powoduje zgłoszenie sprawdzanego wyjątku: IOException; trzeba będzie go złapać i albo rzucić wyjątek czasu wykonywania, a nie (jak nowy UncheckedIOException, co komplikuje trochę kod) lub zrobić coś innego (jak to log):

value.ifPresent(v -> { 
    try { 
     gen.writeObject(v); 
    } catch (IOException e) { 
     throw new UncheckedIOException(e); 
    } 
}); 
+0

Próbowałem swoje rozwiązanie i got błąd , Dokonałem edycji mojego wpisu. – Richard

+1

@Richard Ha tak, jeśli twoja metoda zgłasza sprawdzony wyjątek, musisz go złapać i ponownie wyrzucić niezaznaczoną (lub zrobić coś innego). – Tunaki

+0

idealne, działało. Dzięki!! – Richard

Powiązane problemy