一个虚拟主机可以放几个网站,莆田个人仿牌外贸网站建设,申请免费个人网站空间,建卖手机网站与流处理 ambda表达式
定义
lambda表达式不能被独立执行#xff0c;因此必须实现函数式接口#xff0c;并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示
“-”符号是由英文状态下的“-”和“”组成的#xff0c;符号之间没有空格。 lambd…与流处理 ambda表达式
定义
lambda表达式不能被独立执行因此必须实现函数式接口并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示
“-”符号是由英文状态下的“-”和“”组成的符号之间没有空格。 lambda表达式中可以用“(a1,a2,a3)”的方法表示有参抽象方法圆括号里的标识符对应抽象方法的参数。如果抽象方法中只有一个参数lambda表达式则可以省略圆括号。
lambda表达式中的参数不需要与抽象方法的参数名称相同但顺序必须相同。 lambda表达式调用外部变量
无法更改局部变量
局部变量在lambda表达式中默认被定义为finallambda表达式只能调用局部变量无法更改局部变量。
错误示范 可以更改类成员变量
lambda表达式可以调用并修改类成员变量的值。
lambda表达式只是描述了抽象方法是如何实现的在抽象方法没有被调用前lambda表达式中的代码并没有被执行因此在运行抽象方法之前类成员变量的值不会发生变化。
只要抽象方法被调用就会执行lambda表达式中的代码类成员变量的值也就会被修改。 lambda表达式与异常处理
lambda表达式没有定义异常但会默认抛出抽象方法原有的异常当此方法被调用时则需要进行异常处理。
实例
创建自定义异常UnderAgeException当发现用户是未成年人时进入此异常处理。创建函数式接口在抽象方法中抛出UnderAgeException异常使用lambda表达式实现此接口并让接口对象执行抽象方法。 方法的引用
ambda表达式中方法也可以作为一个对象被调用。
引用静态方法
类名::静态方法名
::由两个英文冒号组成的操作符冒号之间没有空格。
注意语法中方法名是没有圆括号的。 引用成员方法
对象名::成员方法名 引用带泛型的方法
”::”操作符支持引用带泛型的方法。也支持引用带泛型的类。
与其他使用泛型的场景一样要保证代码前后泛型一致 引用构造方法
lambda表达式有3种引用构造方法的语法分别是引用无参构造方法、引用有参构造方法和引用数组构造方法
引用无参构造方法
类名::new
构造方法与类名相同如果在操作符左右都写上类名会让操作符误以为是在引用与类名相同的静态方法这样会导致程序出现bug所以在操作符右侧写上new关键字表示引用构造方法。
注意new关键字之后没有圆括号也没有参数的定义。如果类中既有无参构造方法又有有参构造方法使用引用构造方法语法后究竟哪一个构造方法被引用了呢引用哪个构造方法是由函数式接口决定的“::”操作符会返回与抽象方法的参数结构相同的构造方法。
例如返回的是调用无参构造方法 引用有参构造方法与引用无参构造方法的语法一样。区别就是函数式接口的抽象方法是有参数的。 引用数组构造方法
类名[]::new Function接口
使用lambda表达式都需要先创建或调用已有的函数式接口但java.util.function包已经提供了很多预定义函数式接口。最常用的接口是FunctionT,R
T被操作的类型可以理解为方法参数类型。
R操作结果类型可以理解为方法的返回类型。 流处理
流处理有点类似数据库的SQL语句可以执行非常复杂的过滤、映射、查找和收集功能并且代码量很少。
Stream接口
流处理的接口都被定义在java.uil.stream包中。BaseStream接口是最基础的接口但最常用的是BaseStream接口的一个子接口—Stream接口。
Stream接口是泛型接口因此流中操作的元素可以是任何类的对象。 表中最后一列“类型”中有两种值中间操作和终端操作。中间操作类型的方法会生成一个新的流对象被操作的流对象仍然可以执行其他操作终端操作会消费流操作结束之后被操作的流对象就不能再次执行其他操作了。这是二者的最大区别。
Collection接口新增两个可以获取流对象的方法。
可以获取集合的顺序流
StreamE stream();
获取集合的并行流
StreamE parallelstream(); Optional类
Optional类保存的值不会是null
Optional类由于是用final修饰的因此不能有子类。
Optional类由于是带有泛型的类因此可以保存任何对象的值。
Optional类中有一个叫作value的成员属性这个属性就是用来保存具体值的。value是用泛型T修饰的并且还用了final修饰这表示一个Optional对象只能保存一个值。 数据过滤
filter()方法是Stream接口提供的过滤方法。
将lambda表达式作为参数然后按照lambda表达式的逻辑过滤流中的元素。
过滤出想要的流元素后还需Stream提供的collect()方法重新进行封装。 distinct()方法是Stream接口提供的过滤方法。该方法可以去除流中的重复元素效果与SQL语句中的DISTINCT关键字一样。 limit()方法是Stream接口提供的方法该方法可以获取流中前N个元素。 skip()方法是Stream接口提供的方法该方法可以忽略流中的前n个元素。 数据映射
过滤是在流中找到符合条件的元素映射是在流中获得具体的数据。
Stream接口提供了map()方法用来实现数据映射map()方法会按照参数中的函数逻辑获取新的流对象新的流对象中元素类型可能与旧流对象元素类型不相同。 数据查找
本节所讲的数据查找并不是在流中获取数据这属于数据过滤而是判断流中是否有符合条件的数据查找的结果是一个boolean值或一个Optional类的对象。
allMatch()方法是Stream接口提供的方法该方法会判断流中的元素是否全部符合某一条件返回结果是boolean值。如果所有元素都符合条件则返回true否则返回false。 anyMatch()方法是Stream接口提供的方法该方法会判断流中的元素是否有符合某一条件只要有一个元素符合条件就返回true如果没有元素符合条件则会返回false。
noneMatch()方法是Stream接口提供的方法该方法会判断流中的所有元素是否都不符合某一条件。这个方法的逻辑和allMatch()方法正好相反。
findFirst()方法是Stream接口提供的方法这个方法会返回符合条件的第一个元素。注意这个方法的返回值不是boolean值而是一个Optional对象。 数据收集
数据统计 数据分组
一级分组就是将所有数据按照一个条件进行归类,而不再细分 。
Collectors类提供的groupingBy()方法就是用来进行分组的方法方法参数是一个Function接口对象收集器会按照指定的函数规则对数据分组。
分组规则是一个函数这个函数是由Collectors收集器类调用的而不是Stream流对象。 运行结果 多级分组
按照多个条件进行分组的
学校有100名学生这些学生分布在3个年级中这是一级分组但每个年级还有若干个班级学生被分到不同年级之后又被分到不同的班里这就是二级分组。如果学生再被按男女分组就变成了三级分组。元素按照两个以上的条件进行分组就是多级分组。 运行结果 注意
groupingBy()方法的参数不同
Map对象的嵌套即从左数第一个Map对象做了一级分组第二个Map对象做了二级分组。