我有两个Java列表,一个是我通过一个宁静的端点接收的模型列表,另一个是我数据库中的实体列表。我遍历所有实体,并使用插入后生成的适当ID更新模型。我需要这样做,因为模型还有其他信息,这些信息不在我以后需要使用的实体中。

这是我现在正在做的并且有效:

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


我觉得这可能会更清洁。基本上,我遍历实体,找到匹配的模型,使用来自实体的ID更新模型,或者在没有匹配项的情况下将其设置为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;
}

最佳答案

如果我理解正确,那么您的代码将执行以下操作:


每个保存的用户实体
将其映射到UploadUser List中的单个元素,用户名不区分大小写地匹配
将找到的UploadUser的ID设置为SavedUserEntity的ID
将找到的UploadUsers收集到列表中。


uploadUserList.stream()在我看来很可疑,因为它遍历savedUserEntities的每个元素的uploadUserList。假设uploadUserList不变,那可能是浪费时间。与其遍历列表,不如您想在地图中查找元素。

另外,Streams文档指出,存在peek方法主要是为了支持调试,因此我在实际使用peek方面有所保留。

我建议这样的事情:

我们首先构建一个将用户名与UploadUser关联的Map。如果找到多个用户名,请使用第一个(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的ID,而丢弃具有相同用户名的其他UploadUser(它们存在吗?)。

也,


  使用来自实体的ID更新模型,或者如果没有匹配项,则将其设置为null


您没有将任何内容设置为null。您的过滤器会丢弃所有不匹配的UploadUser,因此i -> i.setId(x.getId())仅在匹配时执行。

09-27 22:52