2016-05-04 12 views
6

Ich habe ein Java-optionales Objekt, das ich nur bekommen möchte, wenn es vorhanden ist. Der offensichtliche Code ist hier:Java Optional Erhalten, wenn vorhanden

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

Aber ich will sehen, ob ich die 1 Zeile mit dem ifPresent Verfahren kann Steamline. Ich möchte nicht, dass es überhaupt schreibt, wenn es nicht vorhanden ist. Ich habe so etwas versucht:

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

Aber das hat eindeutig nicht funktioniert. Gibt es eine Möglichkeit zu tun, was ich will? Alles, was ich online recherchiert habe, zeigt nur die Verwendung von ifPresent mit einem Methodenaufruf für das Prädikat.

Edit 1: versuchte ich Tunaki Lösung, aber ich die folgende Fehlermeldung erhalten:

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

Hier ist mein ganzer Block von Code:

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

Ich habe sogar versucht:

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); 
     } 
    } 
} 

Aber es gibt mir immer noch der Fehler.

value.ifPresent(gen::writeObject); 

Dies wird berufen sich auf die Methode nur, wenn die Optional nicht leer ist:

Antwort

14

Sie können in ifPresentgen.writeObject als Verbraucher des Objekts aufrufen.

In Ihrem Beispiel gibt die Methode writeObject die geprüfte Ausnahme aus IOException; Sie fangen müssen und entweder eine Laufzeitausnahme statt (wie die neue UncheckedIOException, die ein wenig kompliziert die Code) zu werfen oder etwas anderes tun (es wie log):

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

Ich habe versucht, Ihre Lösung und bekam einen Fehler Ich habe eine Änderung an meinem Post vorgenommen. – Richard

+1

@Richard Ha ja, wenn Ihre Methode eine geprüfte Ausnahme auslöst, müssen Sie sie abfangen und eine unmarkierte Ausnahme erneut ausführen (oder etwas anderes tun). – Tunaki

+0

perfekt, das hat funktioniert. Vielen Dank!! – Richard

Verwandte Themen