【发布时间】:2021-10-15 19:12:34
【问题描述】:
给定以下示例种子:
List<EmailGroupingDataDTO> emailDataToGroup = Arrays.asList(
buildEmailGroupingDto(1L, "member_number_1", "username_1", "group_code_1"),
buildEmailGroupingDto(2L, "member_number_1", "username_1", "group_code_1"),
buildEmailGroupingDto(3L, "member_number_1", "username_2", "group_code_1"),
buildEmailGroupingDto(4L, "member_number_1", "username_2", "group_code_1"),
buildEmailGroupingDto(5L, "member_number_1", "username_2", "group_code_3"),
buildEmailGroupingDto(6L, "member_number_2", "username_1", "group_code_1"),
buildEmailGroupingDto(7L, "member_number_2", "username_1", "group_code_2"),
buildEmailGroupingDto(8L, "member_number_2", "username_1", "group_code_2"),
buildEmailGroupingDto(9L, "member_number_3", "username_1", "group_code_1"),
buildEmailGroupingDto(10L, "member_number_3", "username_1", "group_code_1"),
buildEmailGroupingDto(11L, "member_number_3", "username_1", "group_code_2"),
buildEmailGroupingDto(12L, "member_number_3", "username_1", "group_code_2"),
buildEmailGroupingDto(13L, "member_number_3", "username_1", "group_code_3"),
buildEmailGroupingDto(14L, "member_number_4", "username_1", "group_code_3"),
buildEmailGroupingDto(15L, "member_number_4", "username_1", "group_code_3")
);
我想根据以下任一属性在遍历列表时是否发生变化来创建列表(批次):
private boolean isEmailDataEqual(EmailGroupingDataDTO currDto, EmailGroupingDataDTO nextDto) {
return currDto.getMemberNumber().equals(nextDto.getMemberNumber())
&& currDto.getUsername().equals(nextDto.getGroupCode())
&& currDto.getGroupCode().equals(nextDto.getGroupCode());
}
通过定期迭代,我可能可以自己管理这个。
但是我的问题是是否有一个流 api 可以声明式地管理它。
【问题讨论】:
-
你试过 Collectors.toMap 了吗??
-
@Antoniossss 每个属性更改都应该迭代地触发新列表的开始。 IE。这不是常规聚合。
-
这大部分都可以通过一组嵌套的
flatMaps 来实现,但是如果不使用库或其他东西,一开始的索引会使它变得更加困难。 -
@LouisWasserman 感谢您的合理解释。我只是在写一个迭代器;希望有一个简单的声明性流api,但没关系。顺便说一句,这些索引只是属性。它只不过是一个隐藏在工厂方法后面的构造函数,用于跳过单元测试不需要的字段。
-
@html_programmer 您可以拥有完全可以做到这一点的全状态收集器。它是简单的聚合——它只是通过比较当前和以前的元素生成的键。我认为在非并行流中,顺序是有保证的,因此它应该可以工作。