• 十四章,lambda表达式与流处理


    lambda表达式:


    减少代码量,只有一个作用,补全方法体,一般用在匿名内部类
    原来内部类
    SeyHi sh = new SeyHi() {
                public String say() {
                    return "这是一个匿名内部类";
                }
            };
            System.out.println(sh.say());
            }
    这是lambda表达式:
    SeyHi sh1 = () -> {
                return "这里是lambda表达式";
            };
            System.out.println(sh1.say());
        }
    在lambda表达式中局部变量是不可被更改的,因为默认被定义为final常量。
    在lambda表达式中成员变量是可被调用且更改的

    lambda方法的引用


    引用符号:“::”
    引用静态方法:要有static修饰方法
    静态方法引用语法:接口类名 接口名 = 类名 :: 类方法名;

    引用成员方法:要先new对象,把类的对象实例化出来
    成员方法引用语法:接口类名 接口名 = 类对象名 :: 方法名;

    引用构造方法:因为构造方法与类名相同,所以接口方法的类型必须是类名,有参构造方法跟无参构造只能有一个,具体看接口有无参数同时接口同时接口里引用的构造方法只能存在一个
    语法:接口类名 接口名 = 类名::new
    类名 对象名 = 接口名.action()

    引用有参构造方法:跟引用无参构造方法一样,区别就是函数式接口的抽象方法是有参数的
    语法:接口类名 接口名 = 类名::new
    类名 对象名 = 接口名.action(要传入的参数)

    引用数组构造方法:把数组当做泛型,如果方法返回值是泛型,在这种特殊场景下,方法就应该返回一个数组类型的结果。如果要求抽象方法既引用构造方法,又要返回数组类型的结果,这种场景下抽象方法的参数就有了另外的含义:数组个数。抽象方法的参数可以决定返回数组的长度,但数组中的元素并不是有值的,还需要再次赋值
    语法:接口类名<类名[]> 接口名 = 类名[]::new

    Fuction接口


    此接口有两种泛型:
    T:被操作的类型,可以理解为方法参数类型
    R:操作结果类型,可以理解为方法的返回类型
    Fuction接口接口是函数式接口,所以只有一个抽象方法,但是Fuction接口还提供了3个已实现的方法方便开发者对函数逻辑进行更深层的处理。
    Fuction接口方法:

    流处理:


    流处理有点类似数据库的SQL语句,能执行非常复杂的过滤、映射、查找和收集功能,代码量少,缺点就是代码可读性不高

    Stream接口


    流处理的接口都是定义在java.uil.stream包下
    绝大部分的流处理都是在 Stream接口 上实现的,是最基础的流处理接口
    Stream接口 是泛型接口,所以流中的操作元素可以是任何类的对象

    Stream接口常用方法

    Optional类


    ptional类像是一个容器,可以保存任何对象,并且针对空指针异常做了优化处理,保证ptional类保存的值不会是null,所以ptional类针对“对象可能是null也可能不是null”的场景提供了优质的解决方案,减少了繁琐的异常处理
    ptional类是用final修饰的,所以不能有子类,ptional类是带有泛型的类,所以该类可以保存任何对象的值
    ptional类中有一个叫做value的成员属性,这个属性就是用来保存具体值的,value是用泛型T来修饰的,并且用了final修饰,这表示Optional类只能保存一个值

    Optional类提供的常用方法

    Collectors类


    Collectors类为收集器类,该类实现了 java.util.Collector 接口,可以将 Stream 流对象进行各种各样的封装、归集、分组等操作。

    Collectors类的常用方法

    数据过滤


    数据过滤就是在杂乱的数据中筛选出需要的数据,给出一定条件,将符合的条件数据过滤并展示出来
    filter()方法
    filter()方法是Stream接口提供的过滤方法,该方法可以将lambda表达式作为参数,然后按照lambda表达式的逻辑过滤流中的元素。过滤出想要的流元素后,还要使用Stream提供的 collect()方法按照指定的方法重新封装
    distinct()方法
    distinct()方法是Stream接口提供的过滤方法该方法可以去除流中重复的元素,效果跟SQL语句中的DISTINCT关键字一样
    limit()方法
    limit()方法是Stream接口提供的方法,该方法可以获取流中前n个元素
    skip()方法
    skip()方法是Stream接口提供的方法,该方法可以忽略流中的前n个元素

    数据映射


    数据映射和过滤的概念不同,过滤是在流中找到符合条件的元素,映射是在流中获得具体的数据
    Stream接口提供了 map()方法用来实现数据映射,map()方法会按照参数中的函数逻辑获取新的流对象,新的流对象中元素类型可能与旧流对象元素类型不相同。

    数据查找


    数据查找是判断流中是否有符合条件的数据,查找的结果是一个Boolean值或者Optional类的对象
    allMatch方法()
    allMatch()方法是Stream接口提供的方法,该方法会判断流中的元素是否全部符合某一条件,返回结果是Boolean值。如果所有元素条件符合则返回true,否则返回false
    anyMatch()方法
    anyMatch()方法是Stream接口提供的方法,该方法会判断流中元素是否符合某一条件,只要有一个元素符合条件就返回true,如果没有符合条件的元素才会返回false
    noneMatch()方法
    noneMatch()方法是Stream接口提供的方法,该方法会判断流中的所有元素是否都不符合某一条件,此方法逻辑刚好与allMatch()方法正好相反
    findFirst()方法
    findFirst()方法方法是Stream接口提供的方法,该方法会返回符合条件的第一个元素

    数据收集


    数据收集可以理解为高级的“数据过滤+数据映射”,是对数据的深加工。
    数据统计:可以筛选出特殊元素,还可以对元素的属性进行统计计算。这种复杂的统计操作不是由Stream实现的,而是由Collectors收集器类实现的,收集器提供了非常丰富的API,有着强大的数据挖掘能力

    数据分组


    数据分组就是将流中元素按照指定的条件分开保存,分组之后的数据会按照不同的标签分别保存成一个集合,然后按照“键-值”关系封存在Map对象中
    数据分组有:一级分组、多级分组两种场景


    一级分组:

    将所有数据按照一个条件进行归类,跟一维数组相似    例:学校有100个学生,条件就是按年级分组,直接将学生归类到相应的年级中,然后就不在细分了
    Collectors 类提供的 groupingBy()方法就是用来进行分组的方法,方法参数是一个 Function 接口对象,收集器会按照指定的函数规则对数组进行分组

    多级分组:

    将所有条件对照多个条件进行分组,跟二位数组相似    例:学校有100个学生,条件就是按年级班级分组,将相应的学生归类到年纪之后再细分班级。
     

  • 相关阅读:
    KY199 查找
    C#访问修饰符、修饰符
    【论文导读2】Causal Machine Learning:A Survey and Open Problems
    图像处理Sobel 算子
    Flask - 返回 json 格式数据 - json 数据传输支持中文显示
    Flutter 视频video_player与缓存flutter_cache_manager
    基于ffmpeg进行视频解码
    C语言怎样初始化图形模式?
    独立站3大火爆类目推荐
    c语言难点
  • 原文地址:https://blog.csdn.net/2301_76551149/article/details/134332338