我需要根据创建日期字段将序列号添加到对象列表中 代码是用 Java 11 编写的。 我有一个像下面这样的列表
public class UserInformation {
private String userSeqNumber;
private String userDepartment;
private Date createdDate;
}
我可以按创建日期对列表进行排序,但同时我需要根据创建日期按升序添加 userSequenceNumber。 我在这里尝试了一个混乱的代码,有人可以帮助我吗?
userInformations.stream()
.filter(c-> c.getUserDepartment().equalsIgnoreCase(request.getUserDepartment()))
.sorted(Comparator.comparing(UserInformation::getCreatedDate))
.forEach(f -> f.setUserSeqNumber());
因此输出应该针对每个部门,序列号应根据使用创建日期的条目数递增。
UserInformation:[{"1","IT",01-01-2022}, {"2","IT",01-02-2022},{"1","OPS",01-01-2022}, {"2,"OPS",01-02-2022}]
可能我不明白这个问题,因为您的代码示例引用了未知字段(
referringDepartment
,referralSeqNumber
)和未知类(SIUInformation
),但我猜这可能是您或多或少需要的?
userInformations.stream()
.collect(Collectors.groupingBy(UserInformation::getUserDepartment))
.values()
.forEach(listForDepartment -> {
AtomicInteger x = new AtomicInteger(1);
listForDepartment.stream()
.sorted(Comparator.comparing(UserInformation::getCreatedDate))
.forEachOrdered(item -> item.setUserSeqNumber(String.valueOf(x.getAndIncrement())));
});
首先按部门对
UserInformation
对象进行分组(生成 Map<String List<UserInformation>
),然后循环此操作创建的映射中的值。然后,您使用 sorted()
按createdDate 对值进行排序(日期比较器默认为升序),然后开始根据元素的顺序填充 userSeqNumber,对于地图中的每个部门从 1 重新开始。forEachOrdered
而不是 forEach
,因为我明确想要记录顺序很重要,即使在这种情况下,如果使用 forEach
也不会破坏代码。
流不跟踪它们已处理的项目数量。实现您想要的最简单的方法就是分两部分完成。
List<UserInformation> sorted = userInformations.stream()
.filter(c-> c.getReferringDepartment().equalsIgnoreCase(referralReq.getReferringDepartment()))
.sorted(Comparator.comparing(SIUInformation::getCreatedDate))
.collect(Collectors.toList());
IntStream.range(0, sorted.size()).forEach(i -> sorted.get(i).setReferralSeqNumber(i));
在所有内容都排序之前,您无法真正设置序列号。 所以在我看来,使用流没有多大意义。 根据现有信息,我只会执行以下操作:
userInformation.sort(Comparator
.comparing(UserInformation::getCreatedDate));
// now assign the ids.
int id = 1;
for(UserInformation user : userInformation) {
user.setUserSeqNumber(id++ +"");
}