首页 > 解决方案 > 如何在多个属性上获得不同的列表计数?

问题描述

我正在尝试保存管理员列表,我需要验证唯一的用户名和电子邮件地址。首先,我需要在我的请求 DTO 列表中验证该条件,然后使用已保存在我的数据库中的列表再次检查它。

我对用户名和电子邮件地址使用 distinct 一次检查了 RequestDTO。然后,我再次检查了数据库。这样做会执行多个循环。

我已经提到了以下方法:

由多个属性区分的 Java 流

java 8如何在多个属性上获得不同的列表

Java 8 按属性区分

@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 -> 不允许

(第一个是用户名,第二个是电子邮件地址)

标签: javajava-8

解决方案


推荐阅读