Java 17均分牌组:无需AtomicInteger与二次Stream的实现方案
Java 17 无状态流式发牌实现方案
核心实现代码
import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; record Card(String suit, String rank) {} public class CardDealer { public static List<List<Card>> dealCards(List<Card> cards, int numberOfPlayers, int numberOfCardsPerPlayer) { int totalCardsToDeal = numberOfPlayers * numberOfCardsPerPlayer; return IntStream.range(0, totalCardsToDeal) .boxed() .collect(Collectors.groupingBy( idx -> idx % numberOfPlayers, Collectors.mapping(cards::get, Collectors.toList()) )) .entrySet() .stream() .sorted(Map.Entry.comparingByKey()) .map(Map.Entry::getValue) .collect(Collectors.toList()); } }
实现说明
- 无状态设计:全程未使用
AtomicInteger或其他可变对象,完全依赖Stream的纯函数式操作,符合无变易性要求 - 单次Stream流水线:从
IntStream.range初始化到最终collect生成结果,仅用一条完整的Stream链,无两次Stream调用 - 无显式循环:所有逻辑通过Stream的分组、映射、排序操作完成,替代传统循环
- 原生API依赖:仅使用Java SE 17内置的
java.util.stream和集合类,无需外部库
逻辑细节
- 先计算总发牌数
totalCardsToDeal,确保只处理需要发的牌 - 通过
IntStream.range生成0到总发牌数-1的索引流,模拟每张待发牌的位置 - 用
groupingBy按索引 % 玩家数分组,实现"轮流发牌"的逻辑(第i张牌发给第i%numberOfPlayers位玩家) - 对分组后的条目按玩家编号排序,保证结果列表的顺序与玩家编号一致
- 提取每个分组的牌列表,最终收集为包含玩家牌组的列表
内容的提问来源于stack exchange,提问作者hubert
相关产品推荐
相关产品推荐

