Java基础进阶
创始人
2024-05-14 18:15:45
0

Stream流

引例
需求:按照下面要求完成集合的创建和遍历
创建一个集合,存储多个字符串元素
1. 把所有以“曹”开头的元素存储到新集合中
2. 把曹开头,长度为3的元素存储到新集合中

 List list = List.of("曹操", "曹孟德", "曹子恒", "曹子建", "司马懿", "司马师", "司马昭", "曹丕");// 1. 把所有以“曹”开头的元素存储到新集合中List list1 = new ArrayList<>();for (String s : list) {if(s.startsWith("曹")){list1.add(s);}}System.out.println(list1);// 2. 把曹开头,长度为3的元素存储到新集合中List list2 = new ArrayList<>();for (String s : list1) {if(s.length() == 3){list2.add(s);}}System.out.println(list2);

输出结果:

[曹操, 曹孟德, 曹子恒, 曹子建, 曹丕]
[曹孟德, 曹子恒, 曹子建]

上面太麻烦了
用Stream流只需要一行代码:

list.stream().filter(name -> name.startsWith("曹")).filter(name -> name.length() == 3).forEach(name -> System.out.println(name));
  • stream流的作用:结合Lamada表达式,简化集合、数组的操作
  • 使用步骤:
    • 先得到一条stream流,并把数据放上去

      获取方式方法名说明
      单列集合default Stream stream()Collection中的默认方法
      双列集合无法直接使用Stream流,需要通过keySet()或entrySet()转换成单列集合
      数组public static Stream stream(T[] array)Arrays工具类中的静态方法
      一堆零散数据public static Stream of(T…values)Stream接口中的静态方法
    • 利用stream流中的API进行各种操作:(过滤,转换,统计,打印等等)

      • 中间方法:过滤、转换。方法调用完毕之后还可以调用其他方法
      • 终结方法:统计、打印。最后一步,调用完毕之后不能调用其他方法。
    • 使用中间方法对流水线上的数据进行操作

    • 使用终结方法对流水线上的数据进行操作

		//单列集合Stream流List list = List.of("aa", "bb", "cc", "dd");list.stream().forEach(s -> System.out.println(s));//双列集合Stream流Map map = Map.of("aa", "11", "bb", "22", "cc", "33");map.entrySet().stream().forEach(m -> System.out.println(m));//数组Stream流int[] arr = {1,2,3,4,5};Arrays.stream(arr).forEach(a -> System.out.println(a));//零散数据Stream流Stream.of(11,12,13,14,15).forEach(s -> System.out.println(s));

注意:Stream接口中静态方法of的细节:方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组,但数组必须是引用数据类型的,如果传递基本数据类型,会把整个数组当做一个元素传到Steam流中

		int[] arr1 = {1,2,3,4,5};String[] arr2 = {"a", "b", "c", "d", "e"};Stream.of(arr1).forEach(s -> System.out.println(s)); //输出[I@7699a589Stream.of(arr2).forEach(s -> System.out.println(s)); //输出a b c d e
  • Stream流的终结方法

    名称说明
    void forEach(Consumer action)遍历
    long count()统计
    toArray()收集流中的数据,放到数组中
    collect(Collector collrctor)收集流中的数据,放到集合中
    1. forEach 返回值是void,因此是终结方法,不能再在后面调用函数
    • Consumer的泛型:表示流中数据的类型

    • accept方法得形态integer:依次表示流里面的每一个数据

    • 方法体:对每一个数据要做的操作(打印)

      		List list = List.of(1,2,3,4,5);list.stream().forEach(new Consumer() {@Overridepublic void accept(Integer integer) {System.out.println(integer);}});
      
    1. long 返回值是long类型的整数,因此是终结方法

      long c = list.stream().count();
      System.out.println(c);
      
    2. toArray()

    • 空参:返回值是object类型

      		System.out.println("---------------------");Object[] arr1 = list.stream().toArray();        System.out.println(Arrays.toString(arr1));////IntFunction的泛型:具体类型的数组//apply的形态:流中数据的个数,要和数组长度保持一致//apply函数返回值:具体类型的数组//toArray方法的参数的作用:负责创建一个指定类型的数组//方法底层会依次得到流里面每一个数据,并把数据放到数组中//方法返回值:装着流里面所有数组的数组String[] arr = list.stream().toArray(new IntFunction() {@Overridepublic String[] apply(int value) {return new String[0];}});//简化成Lamada表达式形式:list.stream().toArray(value -> new String[value]);
      
    • 有参:返回值是任意类型
      toArray方法的参数的作用:负责创建一个指定类型的数组
      方法底层会依次得到流里面每一个数据,并把数据放到数组中
      方法返回值:装着流里面所有数组的数组

      		//IntFunction的泛型:具体类型的数组//apply的形态:流中数据的个数,要和数组长度保持一致//apply函数返回值:具体类型的数组//toArray方法的参数的作用:负责创建一个指定类型的数组//方法底层会依次得到流里面每一个数据,并把数据放到数组中//方法返回值:装着流里面所有数组的数组String[] arr = list.stream().toArray(new IntFunction() {@Overridepublic String[] apply(int value) {return new String[0];}});//简化成Lamada表达式形式:list.stream().toArray(value -> new String[value]);
      
    1. collect
      在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...