• Stream流


    目录

    Stream流的作用

    Stream流的使用步骤:

    获取Stream流: 

    单列集合

    双列集合

    数组

    一堆零散的数组

    Stream流的中间方法

    filter过滤

    limit获取前几个元素

     skip跳过前几个元素 

    distinct 元素去重,依赖(hashcode和equal法) 

    concat(Stream a, Stream b)     合并a和b两个流为一个流

    map转换流中的数据类型 

    Stream流的终结方法

    forEach遍历 

    count()统计 

     toArray() 收集流中的数据,放到数组中

     collect(Collector collector)                收集流中的数据,放到集合中(list,set,map) 

    练习 

    一、定义一个集合,并添加一些数 1,2,3,4,5,6,7,8,9,10过滤奇数,只留下偶数。并将结果保存起来

     二、创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄"zhangsan,23""lisi,24""wangwu,25”保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值

    三、现在有两个ArrayList集合第一个集合中:存储6名男演员的名字和年龄。第二个集合中:存储6名女演员的名字和年龄。姓名和年龄中间用逗号隔开。比如:张三,23要求完成如下的操作:1,男演员只要名字为2个字的前两人2,女演员只要姓赵的,并且不要第一个3,把过滤后的男演员姓名和女演员姓名合并到一起4,将上一步的演员信息封装成Actor对象,5,将所有的演员对象都保存到List集合中备注:演员类Actor,属性有:name,age


    在Java中,Stream流是一种用于处理数据的抽象概念。它可以用来操作集合、数组、输入/输出资源等,提供了一种统一的处理方式。

    在Java 8中引入了Stream API,它可以让开发者更方便地处理数据集合,以函数式编程的方式进行操作。Stream流支持多种操作,可以分为两类:中间操作和终端操作。

    中间操作是指在数据流中进行处理,可以用来过滤、映射、排序等操作。常用的中间操作有:filter、map、sorted等。

    终端操作是指对数据流进行最终的处理,可以用来收集、计数、求和等操作。常用的终端操作有:collect、count、sum等。

    Stream流的作用

    结合了Lambda表达式,简化集合、数组的操作

    Stream流的使用步骤:

     先得到一条Stream流(流水线),并把数据放上去,再利用Stream流中的API进行各种操作 

    获取Stream流: 

    单列集合

    方法名: 

    default Streamstream() 

    collection中的默认方法

     

    完整代码在这里

    1. public class StreamDemo {
    2. public static void main(String[] args) {
    3. ArrayListlist=new ArrayList<>();
    4. Collections.addAll(list,"a","b","c","d","e");
    5. //获取到一条流水线,并把集合中的数据放到流水线上
    6. Stream stream1 = list.stream();
    7. //使用终结方法打印一下流水线上的所有数据
    8. stream1.forEach(s -> System.out.println(s));
    9. }
    10. }

    双列集合

    无法直接使用Stream流

    可以先用keyset方法获取所有的键,再获取Stream流

    也可以使用entryset方法获取所有的键值对对象,在获取Stream流

    数组

    方法名: 

    public static Stream stream(T[] array)  

    Arrays工具类中的静态方法 

    完整代码在这里 

    1. public class StreamDemo3 {
    2. public static void main(String[] args) {
    3. int[]arr={1,2,3,4,5};
    4. Arrays.stream(arr).forEach(s-> System.out.println(s));
    5. }
    6. }

    一堆零散的数组

    方法名: 

    public static stream of(T... values) 

    Stream接口中的静态方法

     

    注意: 

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

    基本数据类型:

    引用数据类型: 

    Stream流的中间方法

    Streamfilter(Predicate predicate)         过滤

    Streamlimit(long maxSize)                                      获取前几个元素   

    Stream skip(long n)                                                跳过前几个元素

    Stream distinct()                                                     元素去重,依赖(hashcode和equal法)

    static Streamconcat(Stream a, Stream b)       合并a和b两个流为一个流

    Stream map(Function mapper)                  转换流中的数据类型

    注意: 

    中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程

    修改Stream流中的数据,不会影响原来集合或者数组中的数据

    filter过滤

    练习: 把“张”开头的留下,其余数据过滤不要

    上面是拿匿名内部类写的,可以用Lambda表达式简化一下👇


     

    如果我在使用Stream1的话就会报错

    表示在对流进行操作时,流已经被关闭👆,这就是注意的第一点

    中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程👇

    注意的第二点就字面的意思 

     修改Stream流中的数据,不会影响原来集合或者数组中的数据👇

    limit获取前几个元素

    练习:获取前三个元素 

     skip跳过前几个元素 

    例子: 跳过前三个元素

    distinct 元素去重,依赖(hashcode和equal法) 

    例子:

     

    重复的张三被去除了,我们来看看底层

    hashset存储自定义元素的时候要重写hashcode和equals方法 

    concat(Stream a, Stream b)     合并a和b两个流为一个流

    map转换流中的数据类型 

    例子:获取里面的年龄

     

    第一个类型:流中原本的数据类型
    第二个类型:要转成之后的类型
    
    apply的形参s:依次表示流里面的每一个数据
    返回值:表示转换之后的数据
    

     用Lambda表达式表示👇

    Stream流的终结方法

    void forEach(Consumer action)                  遍历
    long count()                                                 统计
    toArray()                                                      收集流中的数据,放到数组中
    collect(Collector collector)                           收集流中的数据,放到集合中 

    forEach遍历 

    Consumer的泛型:表示流中数据的类型

    accept方法的形参s:依次表示流里面的每一个数据

    方法体:对每一个数据的处理操作(打印) 

    用lambda表达式写

     

    count()统计 

     

     toArray() 收集流中的数据,放到数组中

    如果要收集指定类型的👇

     IntFunction的泛型:具体类型的数组

    apply的形参:流中数据的个数,要跟数组的长度保持一致

    apply的返回值:具体类型的数组

    方法体:就是创建数组

    toArray方法的参数的作用:负贵创建一个指定类型的数组

    toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中

    toArray方法的返回值:是一个装着流里面所有数据的数组

     

    用lambda表达式👇

     

     collect(Collector collector)                收集流中的数据,放到集合中(list,set,map) 

    例子:收集到list集合中,把所有男性收集起来 

     

     例子:收集到set集合中,把所有男性收集起来 

    拿收集到list集合跟set集合中与什么区别呢?

     

    set集合会去除重复元素

     例子:收集Map集合当中。把所有的男性收集起来。键:姓名, 值:年龄。

     toMap :参数一表示键的生成规则

                 参数二表示值的生成规则

    参数一:

            Function   泛型一:表示流中每一个数据的类型
                             泛型二:表示Map集合中键的数据类型
            方法apply形参:依次表示流里面的每一个数据

            方法体;生成键的代码

            返回值:已经生成的键

    参数二:

            Function   泛型一:表示流中每一个数据的类型
                             泛型二:表示Map集合中值的数据类型
            方法apply形参:依次表示流里面的每一个数据

            方法体;生成值的代码

            返回值:已经生成的值

     注意:如果我们要收集到Map集合当中。健不能重复。否则会报错

    用lambda表达式写就是👇这样子

     

    练习 

    一、定义一个集合,并添加一些数 1,2,3,4,5,6,7,8,9,10过滤奇数,只留下偶数。并将结果保存起来

     

    完整代码在这里👇 

    1. public class StreamTest1 {
    2. public static void main(String[] args) {
    3. //定义集合
    4. ArrayListlist=new ArrayList<>();
    5. //添加一些整数
    6. Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);
    7. //过滤奇数,只留下偶数
    8. List list1 = list.stream()
    9. .filter(s -> s % 2 == 0)
    10. .collect(Collectors.toList());
    11. System.out.println(list1);
    12. }
    13. }

     二、创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄
    "zhangsan,23"
    "lisi,24"
    "wangwu,25”
    保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值

     

    完整代码在这里👇 

    1. public class StreamTest2 {
    2. public static void main(String[] args) {
    3. ArrayListlist=new ArrayList<>();
    4. Collections.addAll(list,"zhangsan,23","lisi,24","wangwu,25");
    5. Map map = list.stream()
    6. .filter(s -> Integer.parseInt(s.split(",")[1]) >= 24)
    7. .collect(Collectors.toMap(
    8. s -> s.split(",")[0],
    9. s -> Integer.parseInt(s.split(",")[1])));
    10. System.out.println(map);
    11. }
    12. }

    三、现在有两个ArrayList集合
    第一个集合中:存储6名男演员的名字和年龄。第二个集合中:存储6名女演员的名字和年龄。姓名和年龄中间用逗号隔开。比如:张三,23要求完成如下的操作:
    1,男演员只要名字为2个字的前两人
    2,女演员只要姓赵的,并且不要第一个
    3,把过滤后的男演员姓名和女演员姓名合并到一起
    4,将上一步的演员信息封装成Actor对象,
    5,将所有的演员对象都保存到List集合中
    备注:演员类Actor,属性有:name,age

    Actor类

    1. public class Actor {
    2. private String name;
    3. private int age;
    4. public Actor() {
    5. }
    6. public Actor(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. /**
    11. * 获取
    12. * @return name
    13. */
    14. public String getName() {
    15. return name;
    16. }
    17. /**
    18. * 设置
    19. * @param name
    20. */
    21. public void setName(String name) {
    22. this.name = name;
    23. }
    24. /**
    25. * 获取
    26. * @return age
    27. */
    28. public int getAge() {
    29. return age;
    30. }
    31. /**
    32. * 设置
    33. * @param age
    34. */
    35. public void setAge(int age) {
    36. this.age = age;
    37. }
    38. public String toString() {
    39. return "Actor{name = " + name + ", age = " + age + "}";
    40. }

    测试代码👇 

    1. public class StreamTest3 {
    2. public static void main(String[] args) {
    3. //创建两个集合并添加数据
    4. ArrayListmanlist=new ArrayList<>();
    5. Collections.addAll(manlist,"张三,15","李四,18","王五,20","赵六,15","张无忌,16","张三丰,28");
    6. ArrayListwomenlist=new ArrayList<>();
    7. Collections.addAll(womenlist,"赵敏,16","周芷若,18","小龙女,20","貂蝉,15","孙尚香,16","赵欣,28");
    8. //男演员只要名字为2个字的前两人
    9. Stream stream1 = manlist.stream()
    10. .filter(s -> s.split(",")[0].length() == 2)
    11. .limit(2);
    12. //女演员只要姓赵的,并且不要第一个
    13. Stream stream2 = womenlist.stream()
    14. .filter(s -> s.split(",")[0].startsWith("赵"))
    15. .skip(1);
    16. //合并过滤后的男演员姓名与女演员姓名,演员信息封装为Actor对象
    17. List list = Stream.concat(stream1, stream2).map(s ->
    18. new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1])))
    19. .collect(Collectors.toList());
    20. System.out.println(list);
    21. }
    22. }


     stream流就说到这啦!!!感谢各位阅读!!继续努力努力再努力

  • 相关阅读:
    383.赎金信
    24、京东只换不修服务,电脑经常蓝屏申请只换不休记录
    面试浏览器框架八股文十问十答第三期
    阿里P8道出,入职阿里必会199道SpringCloud面试题,你能掌握多少
    无痕视频去水印方法分享-这些软件你值得拥有
    计算机网络TCP篇之流量控制
    安卓版微信8.0.31内测版出炉:安装包变小,功能变多!
    docker系列(4) - docker镜像制作
    Jupyter Notebook(Anaconda)——两个环境分别修改默认打开目录(深度学习第一周番外篇)
    7种方式企业内部资料共享,你pick谁?
  • 原文地址:https://blog.csdn.net/m0_46702681/article/details/138816982