2016-05-04 24 views
6

我有一個java可選對象,我只想知道它是否存在。這裏最明顯的代碼是:Java可選如果存在

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

但我想看看我是否能蒸汽管線,爲1號線與ifPresent方法。如果它不存在,我不希望它寫。我試過這樣的事情:

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

但是,這顯然沒有奏效。有什麼辦法可以做我想做的事嗎?我在網上研究的所有內容僅顯示了使用ifPresent與謂詞的方法調用。

編輯1: 我試圖Tunaki的解決方案,但我收到以下錯誤:

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

這裏是我的代碼整個區塊:

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

我甚至嘗試:

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

但它仍然給我錯誤。

回答

14

可以在ifPresent調用gen.writeObject作爲對象的消費者:

value.ifPresent(gen::writeObject); 

這將調用方法纔會Optional不爲空。

在你的例子中,方法writeObject拋出檢查異常IOException;你需要抓住它,要麼拋出一個運行時異常,而不是(像新UncheckedIOException,其複雜一點的代碼)或做其他事(比如記錄它):

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

我想你的解決方案,並得到了一個錯誤,我編輯了我的文章。 – Richard

+1

@Richard Ha是的,如果你的方法拋出一個檢查異常,你需要捕獲它並重新拋出一個未檢查的異常(或者做其他事情)。 – Tunaki

+0

完美,這工作。謝謝!! – Richard