一、获取Stream流1.单列集合获取Stream流CollectionString list new ArrayList(); StreamString stream list.stream();2.双列集合获取Stream流MapString, String map new HashMap(); //TODO获取键流SetString keys map.keySet(); StreamString stream1 keys.stream(); //TODO获取值流StreamString stream2 map.values().stream(); //TODO获取键值对流SetMap.EntryString, Stringentries map.entrySet(); StreamMap.EntryString, String stream3 entries.stream();3.数组获取Stream流String[] names {张三,李四,王五}; StreamString stream4 Arrays.stream(names);System.out.println(stream4.count()); StreamString stream5 Stream.of(names);System.out.println(stream5);二、Stream流常用中间方法ListString list List.of(苹果, 香蕉, 橙子, 葡萄, 苹果); // 1. filter - 过滤长度大于1的 list.stream().filter(s - s.length() 1).forEach(System.out::println); // 2. sorted - 升序排序 list.stream().sorted().forEach(System.out::println); // 3. sorted(Comparator) - 按长度排序 ------可以自己定义list.stream().sorted((a, b) - a.length() - b.length()).forEach(System.out::println); // 4. limit - 取前2个 list.stream().limit(2).forEach(System.out::println); // 5. skip - 跳过前2个 list.stream().skip(2).forEach(System.out::println); // 6. distinct - 去重 list.stream().distinct().forEach(System.out::println); // 7. map - 转成字符串长度 list.stream().map(s - s.length()).forEach(System.out::println); // 8. concat - 合并两个流 StreamString s1 Stream.of(A, B); StreamString s2 Stream.of(C, D); Stream.concat(s1, s2).forEach(System.out::println);三、终结方法收集Stream流一、收集到List集合javaListString list Stream.of(苹果, 香蕉, 橙子) .filter(s - s.contains(果)) .collect(Collectors.toList()); System.out.println(list); // [苹果]二、收集到Set集合自动去重javaSetString set Stream.of(苹果, 香蕉, 苹果, 橙子) .collect(Collectors.toSet()); System.out.println(set); // [香蕉, 苹果, 橙子]无序去重三、收集到数组3.1 返回Object数组javaObject[] arr Stream.of(A, B, C) .toArray();3.2 返回指定类型数组javaString[] arr Stream.of(A, B, C) .toArray(String[]::new);四、收集到Map集合java// 数据姓名 → 年龄 ListStudent students List.of( new Student(张三, 18), new Student(李四, 20) ); // 收集为 Map姓名, 年龄 MapString, Integer map students.stream() .collect(Collectors.toMap(Student::getName, // key Student::getAge // value)); System.out.println(map); // {张三18, 李四20}1. 原始写法匿名内部类javaMapString, Double map list1.stream().collect(Collectors.toMap(new FunctionTeacher, String() { Override public String apply(Teacher teacher) { return teacher.getName(); } }, new FunctionTeacher, Double() { Override public Double apply(Teacher teacher) { return teacher.getSalary(); } }));2. 简化写法Lambda 表达式javaMapString, Double map list1.stream().collect(Collectors.toMap( teacher - teacher.getName(), teacher - teacher.getSalary() ));3. 最简写法方法引用javaMapString, Double map list1.stream().collect(Collectors.toMap( Teacher::getName, Teacher::getSalary ));五、可变参数注意事项1.可变参数在形参列表只能有一个2.可变参数在形参列表只能放在最后面3.可变参数对内就是一个数组六、斗地主案例package com.itheima.Demo3Comprehensive; import java.util.*; import java.util.stream.Collectors; public class Poker { private static ListString pokers new ArrayList(); private static final MapString, Integer CARD_WEIGHT new HashMap(); // 静态初始化块生成扑克牌 初始化权重映射 static { String[] colors {♠, ♥, ♣, ♦}; String[] numbers {A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K}; String[] order {3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A, 2, 小王, 大王}; // 生成普通牌 for (String color : colors) { for (String number : numbers) { pokers.add(color number); } } // 添加大小王 Collections.addAll(pokers, 大王, 小王); //初始化权重映射用于排序 for (int i 0; i order.length; i) { CARD_WEIGHT.put(order[i], i); } } // 获取一副新牌防御性拷贝 public static ListString getPokers() { return new ArrayList(pokers); } // 打印牌 public static void printPokers(ListString list) { for (String s : list) { System.out.print(s ); } System.out.println(); } // 洗牌 public static void shuffle(ListString list) { Collections.shuffle(list); } // 发牌 public static MapString, ListString deal(ListString list) { MapString, ListString result new HashMap(); ListString user1 new ArrayList(); ListString user2 new ArrayList(); ListString user3 new ArrayList(); ListString holeCard new ArrayList(); for (int i 0; i list.size(); i) { String poker list.get(i); if (i 51) { //前51张轮流发给3人if (i % 3 0) { user1.add(poker); } else if (i % 3 1) { user2.add(poker); } else { user3.add(poker); } } else { // 最后3张作为底牌 holeCard.add(poker); } } result.put(玩家1, user1); result.put(玩家2, user2); result.put(玩家3, user3); result.put(底牌, holeCard); return result; } // 游戏启动 public static void start(ListString pokers) { // 1. 洗牌 shuffle(pokers); // 2. 发牌 MapString, ListString result deal(pokers); // 3. 随机地主 Random r new Random(); int index r.nextInt(3); System.out.println(玩家 (index 1) 抢地主); // 4. 底牌归地主//这里则利用字符串连接的方式来表达我们的用户当然如果玩家真的很复杂也可以添加集合或数组来存储 //然后获取的值是我们的List集合然后用addALL方法添加剩余底牌即可 result.get(玩家 (index 1)).addAll(result.get(底牌));result.remove(底牌); // 5. 手牌排序 sortCardNum(result); // 6. 输出结果 result.forEach((key, value) - { System.out.print(key : ); printPokers(value); }); } // 手牌排序 public static void sortCardNum(MapString, ListString result) { for (String keys : result.keySet()) { ListString collect result.get(keys).stream() .sorted((a, b) - { int indexA getCardIndex(a); int indexB getCardIndex(b); return Integer.compare(indexA, indexB); }) .collect(Collectors.toList()); result.put(keys, collect); } } // 获取牌面权重 private static int getCardIndex(String card) { String num card.replaceAll([♠♥♣♦], );这里有个非常重要的点就是replaceAll是替代也就是如果有[]里的内容那么我们变替代为空也就是return CARD_WEIGHT.getOrDefault(num, -1);getOrDefault是java提供的一个更安全获取值的方法也就是根据key去找值如果没有找到默认返回为-1也就是第二个实参列表} }注意点在这里非常特别的一个点就是针对于玩家牌的排序这里排序不同于简单的数字排序需要我们定义自己的排序规则我们不难知道斗地主中牌牌的大小从小到大依次为// 定义排序规则3 4 ... 2 小王 大王所以我们依次的给它们设置权重比如简单的从0,1,2....开始所以我们可以设置一个map集合来存储键则为我们的牌面数字1,2,k大王...这种而每一个对应的值即从小到大。所以我们排序的话只需要比较牌面数组对应的权重大小即可而这里我们为了去除花色取到数字我们可以用替代的方法String num card.replaceAll([♠♥♣♦], );用这种方法来剔除花色得到数字