2016-05-04 2 views
6

У меня есть необязательный объект java, который я хочу получить, только если он присутствует. Очевидные коды здесь:Java Дополнительно Get if Present

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

Но я хочу, чтобы увидеть, если я могу паропровод, что на 1 линию с помощью метода ifPresent. Я не хочу, чтобы он писал вообще, если его нет. Я пробовал что-то вроде этого:

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

Но это явно не сработало. Есть ли способ сделать то, что я хочу? Все, что я исследовал в Интернете, показывает только использование ifPresent с вызовом метода для предиката.

Edit 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

Вы можете вызвать gen.writeObject как потребитель вашего объекта в ifPresent:

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

Смежные вопросы