Java如何将含Topic枚举列表的Member按枚举值分组为Map<Topic, List<Member>>
实现方案
核心逻辑
你之前的写法是把整个List<Topic>作为分组键,自然得不到预期结果。正确思路是先通过flatMap将每个Member和其订阅的Topic拆分为一对多的(Topic, Member)键值对,再按Topic分组即可,完整实现如下:
完整代码
import java.util.AbstractMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class MemberGroupService { /** * 将会员列表按订阅的Topic分组 * @param memberList 原始会员列表 * @return Key为Topic,Value为订阅该Topic的会员列表 */ public Map<Topic, List<Member>> groupMemberBySubscribedTopic(List<Member> memberList) { return memberList.stream() // 展开为 [Topic, Member] 键值对流 .flatMap(member -> member.getTopics() .stream() // Java 9+ 可直接替换为 Map.entry(topic, member) .map(topic -> new AbstractMap.SimpleEntry<>(topic, member)) ) // 按Topic分组,收集对应会员列表 .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) )); } }
效果验证
如果需要输出你示例中仅展示会员ID的效果,可直接遍历结果集:
// 调用方法拿到分组结果 Map<Topic, List<Member>> groupedResult = groupMemberBySubscribedTopic(yourMemberList); // 打印仅含ID的结果 groupedResult.forEach((topic, members) -> { List<Long> memberIds = members.stream() .map(Member::getId) .collect(Collectors.toList()); System.out.printf("%s=%s%n", topic, memberIds); });
内容的提问来源于stack exchange,提问作者wannaBeDev
相关产品推荐
相关产品推荐

