java - 如何在多个属性上获得不同的列表计数?
问题描述
我正在尝试保存管理员列表,我需要验证唯一的用户名和电子邮件地址。首先,我需要在我的请求 DTO 列表中验证该条件,然后使用已保存在我的数据库中的列表再次检查它。
我对用户名和电子邮件地址使用 distinct 一次检查了 RequestDTO。然后,我再次检查了数据库。这样做会执行多个循环。
我已经提到了以下方法:
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "This is admin request class")
public class AdminRequestDTO implements Serializable {
@ApiModelProperty(value = "This is the id of admin")
private Long id;
@ApiModelProperty(value = "This is the username of admin")
private String username;
@ApiModelProperty(value = "This is full name of admin")
private String fullName;
@ApiModelProperty(value = "This is the email address of admin")
private String emailAddress;
@ApiModelProperty(value = "This is the status of admin")
private Character status;
}
@Entity
@Getter
@Setter
@Table(name = "admin")
public class Admin implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "fullname")
private String fullName;
@Column(name = "password")
private String password;
@Column(name = "email_address", length = 200)
private String emailAddress;
}
public void saveAdmin(List<AdminRequestDTO> adminRequestDTO) {
validateAdminRequestDTO.accept(adminRequestDTO);
List<Admin> admin = adminRequestDTO.stream().map(requestDTO -> {
/*CHECK IF USERNAME AND EMAIL ADDRESS IN REQUESTDTO EXISTS IN DATABASE, ID IT DOES, THEN THROW EXCEPTION*/
/*ELSE CONVERT */
Admin admin1 = new Admin();
admin1.setUsername(requestDTO.getUsername());
/*SET OTHER REQUEST DTOS*/
return admin1;
}).collect(Collectors.toList());
/*SAVE ADMIN*/
adminRepository.saveAll(admin);
}
public Consumer<List<AdminRequestDTO>> validateAdminRequestDTO = (requestDTO) -> {
boolean checkIfRequestHaveSameUsername = requestDTO.stream().map(AdminRequestDTO::getUsername)
.distinct().count() < requestDTO.size();
boolean checkIfRequestHaveSameEmailAddress = requestDTO.stream().map(AdminRequestDTO::getEmailAddress)
.distinct().count() < requestDTO.size();
if (checkIfRequestHaveSameUsername)
throw new DataDuplicationException(AdminMessageConstants.DUPLICATE_USERNAME_MESSAGE,
AdminMessageConstants.DUPLICATE_USERNAME_DEVELOPER_MESSAGE);
if (checkIfRequestHaveSameEmailAddress)
throw new DataDuplicationException(AdminMessageConstants.DUPLICATE_EMAILADDRESS_MESSAGE,
AdminMessageConstants.DUPLICATE_EMAILADDRESS_DEVELOPER_MESSAGE);
};
public Consumer<AdminRequestDTO> validateAdmin = (requestDTO) -> {
if (!Objects.isNull(adminRepository.getAdminByUsername(requestDTO.getUsername()))) ;
throw new DataDuplicationException("Admin username already exits", "Admin username already exits");
/*SIMILARLY FOR EMAIL ADDRESS*/
};
我想重构现有代码,以便减少多个循环。
abc abc@f1soft.com , xyz xyz@f1soft.com -> 允许
abc abc@f1soft.com, abc xyz@f1soft.com -> 不允许
abc abc@f1soft.com, xyz abc@f1soft.com -> 不允许
(第一个是用户名,第二个是电子邮件地址)
解决方案
推荐阅读
- android - 使用 PixelCopy 在 DialogFragment 中复制缩放视图
- vue.js - 如何拆分单元格以匹配我的表格数据使用元素 UI 和 vue?
- python - 检查数据框熊猫中每个数据点的最佳方法
- python-3.x - 通过更改熊猫组内的列值来创建组
- batch-file - 批处理文件 - 读取 csv 值并更改值
- java - JOOQ 查询层次结构
- sql - Oracle 查询返回没有选择的行错误
- c# - Unity:使用 TouchPhase.Moved 时如何停止读取第一次触摸
- google-maps - 带有离子的谷歌地图上的搜索栏
- c# - 通过代码更改音频窗口设置(从设置应用程序)