我有相同代码的2个版本(我假设):
Optional<UserHolder> user = userHolderRepository.findOneByUserId(source.getId());
return user.isPresent()
? user.get()
: userHolderRepository.save(new UserHolder(source.getId(), source.getLogin()));
和
UserHolder userHolder = userHolderRepository
.findOneByUserId(source.getId())
.orElse(userHolderRepository.save(new UserHolder(source.getId(), source.getLogin())));
return userHolder;
我还有一个Message
实体,其中包含@ManyToOne
userHolders。
如果我调用上面的代码来获取用户持有者(如果存在,或者创建一个),则第一个代码段工作正常,而第二个代码段总是导致创建具有相同ID的第二个userHolder。
我认为代码段的行为并不相同,但我应该如何编写Optional
样式代码与第一个代码段完全相同?
谢谢!
答案 0 :(得分:1)
解决此问题的正确解决方案是
UserHolder userHolder = userHolderRepository
.findOneByUserId(source.getId())
.orElseGet(() ->userHolderRepository.save(new UserHolder(source.getId(), source.getLogin())));
return userHolder;
因为描述here,orElse总是生成对象,即使Optional
确实包含值。