9 Java数据结构(下):集合进阶之Map(双列集合)系列、不可变集合、操作集合的Stream流:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类9

📅 2026/8/3 20:02:09
9 Java数据结构(下):集合进阶之Map(双列集合)系列、不可变集合、操作集合的Stream流:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类9
文章目录前言一、 Map(双列集合)接口三、 不可变集合四、Stream流(适用于单列集合、双列集合、数组、一堆零散的数据)1 Stream流是什么?(1)从一个简单的例子出发初体验stream流(2)stream流的思想2 Stream的使用(1)获取Stream流---- 单列集合:default Stream\E stream() | collection中的默认方法---- 双列集合:无法直接使用stream流(只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流)---- 数组:public static \T Stream\T stream(T[]array) | Arrays工具类中的静态方法---- 一堆零散的数据(要求是同种数据类型):public static\T Stream\T of(T... values) | Stream接口中的静态方法(2)Stream流的中间方法---- Stream\T filter(Predicate\? super T predicate) :过滤---- Stream\T limit(long maxSize) :获取前几个元素---- Stream\T skip(long n) :跳过前几个元素---- Stream\T distinct() :元素去重,依赖(hashCode和equals方法)---- static \T Stream\T concat(Stream a, Stream b) :合并a和b两个流为一个流---- Stream\R map(Function\T , R mapper) :将流中的每个元素映射到另一个值,常用于进行转换流中的数据类型(常用!!!!!!!!!!)---- Stream\T sorted() :排序---- Stream\T sorted(Comparator\? super T comparator):按指定规则排序(3)Stream流的终结方法---- void forEach(Consumer\? super T action) :遍历流中的数据---- A[] toArray(IntFunction\A[] generator) :返回流中的数据组成的数组(常用!!!!!!)---- R collect(Collector\? super T, A, R collector) :返回流中的数据组成的集合(返回值是List、Set、Map系列)(常用!!!!!!!!!)---- Optional\T max(Comparator\? super T comparator):返回流中最大的元素的 Optional对象---- Optional\T min(Comparator\? super T comparator):返回流中最小的元素的 Optional对象---- long count() :返回流中元素个数---- Optional\T reduce(BinaryOperator\T accumulator) | 将流中的元素反复结合起来,得到一个值3 Stream的一些小练习前言一、 Map(双列集合)接口三、 不可变集合四、Stream流(适用于单列集合、双列集合、数组、一堆零散的数据)1 Stream流是什么?(1)从一个简单的例子出发初体验stream流要了解什么是Stream流,从一个实际例子出发:先看一下如果用我们以前的知识这个需求代码是怎么写的:ArrayListStringlist=newArrayList();list.add("张无忌");list.add("张三丰");list.add("周芷若");list.add("赵敏");list.add("张强");// 1 把所有以“张”开头的元素存储到一个新的集合中ArrayListStringlist2=newArrayList();for(Strings:list){if(s.startsWith("张")){list2.add(s);}}System.out.println(list2);// [张无忌, 张三丰, 张强]// 2 把以“张”开头的所有长度为3的元素存储到一个新的集合中ArrayListStringlist3=newArrayList();for(Strings:list2){if(s.length()==3){list3.add(s);}}System.out.println(list3);// [张无忌, 张三丰]// 3 遍历打印最终结果list3.forEach(s-System.out.println(s));// 张无忌 张三丰可以看到,还是很繁琐的。但是如果采用集合的Stream流写法ArrayListStringlist=newArrayList();list.add("张无忌");list.add("张三丰");list.add("周芷若");list.add("赵敏");list.add("张强");// 筛选出以“张”开头并且长度为3的字符串// 遍历打印最终结果list.stream().filter(s-s.startsWith("张")).filter(s-s.length()==3).forEach(System.out::println);// 张无忌 张三丰这下应该明白什么是集合的stream流了吧,理解成一个通道,没经过这个通道一部分就会进行一些操作。我们学校stream流就是要学习在这个通道里面的一些常见操作。(2)stream流的思想就像一台流水线一样,在流水线上进行对商品(数据)进行各种处理。结合了Lambda表达式,简化集合、数组的操作这个流水线上的各种操作分为:中间方法:过滤、转换等方法调用完毕后还可以调用其他方法终结方法:统计、打印等最后一步,调用完毕后不能再调用其他方法2 Stream的使用要了解其怎么使用,就必须知道使用中有哪些步骤:Stream流的使用步骤:step1: 先得到一条Stream流(流水线),并把数据放上去step2: 使用中间方法对流水线上的数据进行操作step3: 使用终结方法对流水线上的数据进行操作下面我们就对这几个步骤挨个进行学习。(1)获取Stream流根据数据类型是单列集合、双列集合、数组、一堆零散的数据的不同情况提供了不同的方法调用。获取方式方法名说明单列集合default StreamE stream()collection中的默认方法双列集合无无法直接使用stream流(只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流)数组public static T StreamT stream(T[]array)Arrays工具类中的静态方法一堆零散的数据(需要是同种数据类型)public staticT StreamT of(T… values)Stream接口中的静态方法由于,需要演示,我们提前使用终结方法里面的forEach()方法,其实就和之前的集合遍历差不多---- 单列集合:default StreamE stream() | collection中的默认方法单列集合 default StreamE stream() : collection中的默认方法ArrayListStringlist=newArrayList();Collections.addAll(list,"a","b","c","d","e","f","g","h","i","j");// 1 获取到一条Stream流水线/* // 复杂写法 StreamString stream = list.stream(); stream.forEach(new ConsumerString() { @Override public void accept(String s) { System.out.println(s); // 这个里面 s 就是流水线中的每一个元素 } });*/// 简化写法list.stream().forEach(s-System.out.println(s));// a b c d e f g h i j---- 双列集合:无法直接使用stream流(只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流)无法直接使用stream流,只能先通过keySet() 或者entrySet()先转成单列集合再获取stream流HashMapString,Integermap=newHashMap();map.put("aaa",111);map.put("bbb",222);map.put("ccc",333);map.put("ddd",444);// stream()流 keySet()方法map.keySet().stream().forEach(s-System.out.println(s));// aaa bbb ccc ddd// stream()流 entrySet()方法 里面每一个元素是一个Map.Entry对象map.entrySet().stream().forEach(entry-System.out.println(entry.getKey()+" : "+entry.getValue()));/*aaa : 111 ccc : 333 bbb : 222 ddd : 444*/---- 数组:public static T StreamT stream(T[]array) | Arrays工具类中的静态方法public static T StreamT stream(T[]array) :Arrays工具类中的静态方法String[]arr={"a","b","c","d","e"};// 数组使用Arrays里面的静态方法stream()方法获取Stream流Arrays.stream(arr).forEach(s-System.out.println(s));// a b c d e---- 一堆零散的数据(要求是同种数据类型):public staticT StreamT of(T… values) | Stream接口中的静态方法public staticT StreamT of(T… values) :Stream接口中的静态方法Stream.of(1,2