#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();