9 Java数据结构(下):集合进阶之Map(双列集合)系列、不可变集合、操作集合的Stream流:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类9
2026/8/3 20:02:01 网站建设 项目流程

文章目录

  • 前言
  • 一、 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流,从一个实际例子出发:


  • 先看一下如果用我们以前的知识这个需求代码是怎么写的:
ArrayList<String>list=newArrayList<>();list.add("张无忌");list.add("张三丰");list.add("周芷若");list.add("赵敏");list.add("张强");// 1 把所有以“张”开头的元素存储到一个新的集合中ArrayList<String>list2=newArrayList<>();for(Strings:list){if(s.startsWith("张")){list2.add(s);}}System.out.println(list2);// [张无忌, 张三丰, 张强]// 2 把以“张”开头的所有长度为3的元素存储到一个新的集合中ArrayList<String>list3=newArrayList<>();for(Strings:list2){if(s.length()==3){list3.add(s);}}System.out.println(list3);// [张无忌, 张三丰]// 3 遍历打印最终结果list3.forEach(s->System.out.println(s));// 张无忌 张三丰

可以看到,还是很繁琐的。
但是如果采用集合的Stream流写法

ArrayList<String>list=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 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接口中的静态方法

由于,需要演示,我们提前使用终结方法里面的forEach()方法,其实就和之前的集合遍历差不多

---- 单列集合:default Stream<E> stream() | collection中的默认方法

单列集合 default Stream<E> stream() : collection中的默认方法

ArrayList<String>list=newArrayList<>();Collections.addAll(list,"a","b","c","d","e","f","g","h","i","j");// 1 获取到一条Stream流水线/* // 复杂写法 Stream<String> stream = list.stream(); stream.forEach(new Consumer<String>() { @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流

HashMap<String,Integer>map=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> Stream<T> stream(T[]array) | Arrays工具类中的静态方法

public static <T> Stream<T> 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 static<T> Stream<T> of(T… values) | Stream接口中的静态方法

public static<T> Stream<T> of(T… values) :Stream接口中的静态方法

Stream.of(1,2

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询