Упрощенная сущность карты Java 8 Stream для моделирования - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть два списка в Java: список моделей, которые я получаю через конечную точку отдыха, и список объектов из моей базы данных.Я перебираю все сущности и обновляю модели с соответствующим идентификатором, сгенерированным после вставки.Мне нужно сделать это так, потому что в модели есть другая информация, которой нет в сущности, которую я должен использовать позже.

Это то, что я делаю сейчас, и это работает:

savedUserEntities.stream()
       .map(x ->
               uploadUserList.stream()
                       .filter(i -> x.getUserName().equalsIgnoreCase(i.getUsername()))
                       .peek(i -> i.setId(x.getId()))
                       .findFirst()
                       .orElse(null))
       .filter(Objects::nonNull)
       .collect(Collectors.toList());

Я чувствую, что это может быть немного чище.По сути, я перебираю сущности, нахожу подходящую модель, обновляю модель с помощью идентификатора от сущности или задаю ей значение NULL, если совпадений нет, отфильтровываю получающиеся значения NULL и затем возвращаю обновленные модели.Есть ли более чистый способ сделать то же самое?

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

Это моя сущность:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(nullable = false)
private String userName;
private String firstName;
private String lastName;
private String password;

@Column(nullable = false)
private Long organizationId;

private Long updatedDate;
private Long createdDate;
private Long userInactiveDate;
private Long departmentId;
private String batchId;
private Long tempPasswordExpiresDate;

Это моя модель:

private Long id;
private String firstName;
private String lastName;
private String username;
private Long department;
@JsonDeserialize(contentUsing = NestedDeserializer.class)
private List<Permission> permissions;

@Data
@NoArgsConstructor
private class Permission {
    private long locationId;
    private long roleId;
    private boolean all;
    private boolean assigned;
    private boolean unassigned;
}

1 Ответ

0 голосов
/ 28 февраля 2019

Если я правильно понимаю, ваш код выполняет следующие действия:

  • для каждого сохраненного пользовательского объекта
  • сопоставляет его с одним элементом в UploadUser List, где имя пользователя совпадает, регистр-чувствительно
  • установить идентификатор найденного UploadUser равным идентификатору SavedUserEntity
  • собрать найденных UploadUsers в список.

uploadUserList.stream() выглядит подозрительно для меня, так как он пересекаетuploadUserList для каждого элемента savedUserEntities.Предполагая, что uploadUserList не изменяется, это может быть пустой тратой времени.Вместо того, чтобы обходить список, вы можете вместо этого искать элемент на карте.

Кроме того, в документации Streams говорится, что метод peek существует главным образом для поддержки отладки, поэтому я немного сдерживаюсьчтобы на самом деле использовать peek.

Я бы предложил что-то вроде этого:

Сначала мы строим карту, которая связывает имя пользователя с UploadUser.Если найдено несколько имен пользователей, используйте первое (left одно).

Map<String, UploadUser> uploadUserMap = uploadUserList.stream()
    .map(t -> new SimpleEntry<>(t.getUserName().toLowerCase(), t))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (left, right) -> left));

Затем мы проходим по SavedUserEntries и проверяем, существует ли соответствующий UploadUser (по имени пользователя без учета регистра).Если так, то установите id и сопоставьте текущий SavedUserEntry с UploadUser.
Наконец, соберите результаты.

List<UploadUser> uploadUsers = savedUserEntities.stream()
    .filter(t -> uploadUserMap.containsKey(t.getUserName().toLowerCase()))
    .map(t -> {
        UploadUser uploadUser = uploadUserMap.get(t.getUserName().toLowerCase());
        uploadUser.setId(t.getId());
        return uploadUser;
    })
    .collect(Collectors.toList());

Однако мне не совсем понятно, почему вы должны выбрать одного UploadUser по их имени пользователяи присвойте ему идентификатор saveUserEntity, отбрасывая другие UploadUsers с тем же именем пользователя (они существуют?).

Также

обновляя модель с помощью идентификатора из объектаили установите его в нуль, если не найдено совпадений

Вы ничего не устанавливаете в null.Ваш фильтр отбрасывает все UploadUsers без совпадения, поэтому i -> i.setId(x.getId()) выполняется только тогда, когда равно совпадению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...