2016-05-04 10 views
6

私はそれが存在する場合に取得したいjavaオプションのオブジェクトを持っています。明白なコードはここにある:Javaオプション現在の場合取得

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

しかし、私はifPresent方法で1行にそれを蒸気管路できるかどうかを確認したいです。私はそれが存在しない場合は、まったく書きたくない。私はこのようなものを試した:

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

@リチャードHaはいあなたのメソッドがチェック例外をスローした場合は、それをキャッチして未確認の例外を再スローする必要があります。 – Tunaki

+0

完璧な、これは働いた。ありがとう!! – Richard