Измените необязательный, если он присутствует

#java #java-8 #optional

Вопрос:

У меня есть сценарий, в котором я получаю сообщение Optional<Person> person из базы данных, и мне нужно изменить person его, как person.setRole("Admin") если бы человек присутствовал, и установить его в моем MainClass.java .

Я пытался :

 var p = person.map(person1 -> person1.setRole("Admin"));
 

но это кажется неправильным.
Я хочу обновить один и тот же объект, а не создавать новый.

Редактировать:

После установки значения мне нужно установить этот объект person, поскольку он является переменной-членом в классе отдела.

 @Builder //lombok
class Department {
    private Long depId;
    private Person person;
}
 

MainClass.java

 Department.builder()
          .depId(1L)
          .person( The person that I will get from the operation I need )
          .build()
 

Заранее спасибо.

Комментарии:

1. person.ifPresent(person1 -> person1.setRole("Admin")); без другого задания.

2. Мне нужно установить это person в другом объекте отдела. Если я использую ifPresent его, он вернет меня void , что не является моим идеальным сценарием. Пожалуйста, проверьте ПРАВКУ вопроса.

3. Дублирующий вопрос по желанию. Карта выполняется только «если присутствует» и возвращает необязательный параметр. Если вы хотите, чтобы возвращался объект person, также добавьте «.OrElse» или что-то в этом роде, чтобы создать исключение или указать значение по умолчанию. Я уверен, что если вы осмотритесь, то обнаружите, что это тщательно экспортировано.

4. Вы изменили вопрос. То, что вы хотите сделать после выполнения setRole("Admin") , не имеет ничего общего с тем, о чем вы просили раньше. Ваш map подход не лучше послужил вашей новой задаче, чем ifPresent .

5. Перед редактированием вы не говорили, что хотите передать что-то разработчику. Ваша опубликованная попытка по- var p = person.map(person1 -> person1.setRole("Admin")); прежнему не связана с этой попыткой строителя. И нет никаких причин, по которым эти две вещи должны быть смешаны. Вы хотите вызвать setRole("Admin") , когда необязательный параметр не пуст, person.ifPresent(person1 -> person1.setRole("Admin")); сделаете это. Затем вы хотите передать человека строителю, без проблем, но вам нужно решить, что делать, когда опция пуста. Например, как сказал К. Николас, orElse это один из способов, если у вас есть запасной вариант

Ответ №1:

Вы не указали, что вы хотите делать, если опция пуста. Поскольку @Builder.Default сверху их нет person , я предполагаю, что вы хотите сохранить их, как null если бы опция была пустой.

Вы могли бы предоставить ifPresent первый, чтобы установить роль. Он будет выполняться только при наличии значения, в противном случае ничего не делает. Затем передайте объект, вызвав orElse этот объект, построителю.

 optPersonFromDb.ifPresent(p -> p.setRole("Admin"));
Department.builder()
          .depId(1L)
          .person(optPersonFromDb.orElse(null))
          .build();