首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据条件批量拆分ArrayList的流式接口

根据条件批量拆分ArrayList的流式接口
EN

Stack Overflow用户
提问于 2021-10-15 19:12:34
回答 2查看 71关注 0票数 0

给定以下示例种子:

代码语言:javascript
运行
复制
    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")
    );

我想创建一个列表(批)列表,基于迭代列表时以下属性之一是否发生更改:

代码语言:javascript
运行
复制
private boolean isEmailDataEqual(EmailGroupingDataDTO currDto, EmailGroupingDataDTO nextDto) {
    return currDto.getMemberNumber().equals(nextDto.getMemberNumber())
        && currDto.getUsername().equals(nextDto.getGroupCode())
        && currDto.getGroupCode().equals(nextDto.getGroupCode());
}

通过定期迭代,我可能可以自己管理这一点。

然而,我的问题是,是否有一个流api可以声明性地管理这一点。

EN

回答 2

Stack Overflow用户

发布于 2021-10-15 20:24:14

StreamEx将为您完成以下操作:

代码语言:javascript
运行
复制
List<List<EmailGroupingDataDTO>> groups = StreamEx.of(emailDataToGroup)
        .groupRuns(this::isEmailDataEqual)
        .toList();
票数 2
EN

Stack Overflow用户

发布于 2021-10-15 21:42:46

您可以使用AtomicInteger & AtomicReference作为Collectors.groupingBy的分类器,并构建一个映射(并使用Map.values获取分组的批次)。整数作为组键,引用作为组的代表性元素,并为您的属性提供一种简单的比较方法。

代码语言:javascript
运行
复制
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

....


List<EmailGroupingDataDTO> emailDataToGroup = //your list 

AtomicInteger ai = new AtomicInteger();
AtomicReference<EmailGroupingDataDTO> myRef = new AtomicReference<>(emailDataToGroup.get(0));

Collection<List<EmailGroupingDataDTO>> result =  
        emailDataToGroup.stream().collect(Collectors.groupingBy(myDto -> {
            boolean equal = isEmailDataEqual(myDto, myRef.get());
            if (!equal) myRef.getAndSet(myDto);
            return equal ? ai.get() : ai.incrementAndGet();
        })).values();

注意:正如@所指出的那样,这种方法只有在你按顺序排列列表的情况下才会起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69589568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档