2016-05-04 16 views
6

Possiedo un oggetto facoltativo java che desidero ottenere solo se è presente. Il codice ovvia è:Java Opzionale Get if Present

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

Ma io voglio vedere se riesco a steamline che a 1 secondo il metodo ifPresent. Non voglio che scriva del tutto se non è presente. Ho provato qualcosa di simile:

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

Ma chiaramente non ha funzionato. C'è un modo per fare ciò che voglio? Tutto ciò che ho cercato online mostra solo l'uso di ifPresent con una chiamata al metodo per il predicato.

Edit 1: ho cercato la soluzione di Tunaki ma sto ottenendo il seguente errore:

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

Ecco il mio intero blocco di codice:

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

Ho anche provato:

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

Ma mi dà ancora l'errore.

risposta

14

È possibile richiamare gen.writeObject come consumatore del vostro oggetto in ifPresent:

value.ifPresent(gen::writeObject); 

Questo richiamerà il metodo solo se il Optional non è vuoto.

Nell'esempio, il metodo writeObject genera l'eccezione verificata IOException; avrete bisogno di prenderlo e sia un'eccezione di runtime invece (come il nuovo UncheckedIOException, che complica un po 'il codice) o fare qualcos'altro (come log esso):

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

ho provato la soluzione e ottenuto un errore , Ho apportato una modifica al mio post. – Richard

+1

@Richard Ha sì se il tuo metodo genera un'eccezione controllata, devi prenderla e rilanciare una non controllata (o fare qualcos'altro). – Tunaki

+0

perfetto, questo ha funzionato. Grazie!! – Richard