我有两个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())
仅在匹配时执行。