You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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和集合类,无需外部库

逻辑细节

  1. 先计算总发牌数totalCardsToDeal,确保只处理需要发的牌
  2. 通过IntStream.range生成0到总发牌数-1的索引流,模拟每张待发牌的位置
  3. 用groupingBy按索引 % 玩家数分组,实现"轮流发牌"的逻辑(第i张牌发给第i%numberOfPlayers位玩家)
  4. 对分组后的条目按玩家编号排序,保证结果列表的顺序与玩家编号一致
  5. 提取每个分组的牌列表,最终收集为包含玩家牌组的列表

内容的提问来源于stack exchange,提问作者hubert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:53:19