【Java】Java8 新特性

筅森魡賤 提交于 2020-10-31 15:07:55


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

Lambda表达式

语法格式:

在这里插入图片描述

lambda表达式的本质:作为函数式接口的实例

Lambda表达式的使用

总结:

左边:Lambda形参列表的参数类型可省略(类型推断);如果形参列表只有一个参数,其()可以省略
右边:Lambda体应该使用一对{}包裹;如果Lambda体只有一条执行语句(可能是return语句),则{}和return可以省略

在这里插入图片描述

在这里插入图片描述

eg1:无参无返回值
在这里插入图片描述
原:
在这里插入图片描述
用lambda表达式写:
在这里插入图片描述




eg2:Lambda需要一个参数,无返回值
在这里插入图片描述
在这里插入图片描述

语法格式3:基于类型推断,数据类型可以省略
在这里插入图片描述
在这里插入图片描述
语法格式4:Lambda只需要一个参数时,小括号可以省
在这里插入图片描述
语法格式5:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
在这里插入图片描述
语法格式6:当lambda体只有一条,return与大括号若有,都可以省略
在这里插入图片描述







函数式接口

  1. 如果一个接口只声明了一个抽象方法,则此接口就称为函数式接口
  2. 可以在接口上使用@FunctionalInterface注解,检查此接口是否是一个函数式接口
  3. java.util.function包下定义了Java8的丰富的函数式接口
    在这里插入图片描述
    eg1:消费型接口
    在这里插入图片描述
    eg2:断定型接口
    在这里插入图片描述




在这里插入图片描述

方法引用与构造器引用

方法引用

  1. 方法引用的使用情境:当要传递给Lambda体的操作已经有实现的方法了,就可以使用方法引用。
  2. 方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同
    格式:
    在这里插入图片描述

情况一:对象::实例方法

例一:Consumer
对于str->System.out.println(str)这个lambda表达式,System.out.println(str)这个操作已经有实现方法:PrintStream中的void println(T t),所以就可以把这个lambda表达式写成方法引用的形式:ps::println
在这里插入图片描述
例二:Supplier
在这里插入图片描述



情况二:类::静态方法

例一:Comparator
在这里插入图片描述
例二:
在这里插入图片描述


情况三:类::实例方法

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

构造器引用

和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。
抽象方法的返回值类型即为构造器所属类的类型
在这里插入图片描述
在这里插入图片描述


数组引用

可以把数组看成一个特殊的类,就和构造器引用的写法一样
在这里插入图片描述

强大的StreamAPI

StreamAPI把真正的函数式编程风格引入到Java中,使用StreamAPI对集合数据进行操作,类似于使用SQL进行的数据库查询。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


创建Stream

  1. 创建Stream方式一:通过集合
    在这里插入图片描述
    在这里插入图片描述

  2. 创建Stream的方式二:通过数组
    在这里插入图片描述
    在这里插入图片描述

  3. 创建Stream方式三:通过Stream的of()
    在这里插入图片描述


  4. 创建Stream方式四:创建无限流(了解)
    在这里插入图片描述
    在这里插入图片描述

Stream的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理,而在终止操作时一次性全部处理

筛选与切片

在这里插入图片描述

  1. filter
    在这里插入图片描述

  2. limit
    在这里插入图片描述
    输出的就是前3行的数据

  3. skip
    在这里插入图片描述

  4. distinct 去重
    在这里插入图片描述

映射

在这里插入图片描述

  1. map
    在这里插入图片描述

  2. flatMap
    相当于把接收的流都打散了
    如下图 用map操作返回的是Stream<Stream<Character>> 我们要想只输出Character就要双重遍历,而用flatMap返回就直接是Stream<Character>直接输出即可
    在这里插入图片描述


排序

在这里插入图片描述

  1. sorted() 自然排序
    在这里插入图片描述

  2. sorted(Comparator com) 定制排序
    在这里插入图片描述

Stream的终止操作

终止操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如List、Integer甚至是void
流进行了终止操作后不能再次使用!!

匹配与查找

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

  1. allMatch、anyMatch和noneMatch
    在这里插入图片描述

  2. findFirst findAny
    在这里插入图片描述

  3. count、max、min
    在这里插入图片描述

  4. 内部迭代
    在这里插入图片描述

归约


在这里插入图片描述

收集

在这里插入图片描述
Collectors类的方法
在这里插入图片描述
想把Collector转成什么类型 就调用Collectors的什么方法


//查找工资大于6000的员工,结果返回一个list
List< Employee> employees = EmployeeData. getEmployees();
List<Employee> employeeList = employees. stream(). filter(e -> e.getSalary() >60000).collect(Collectors.toList()); // 如果要返回set则括号写 Collectors.toSet()
employeeList. forEach(System. out: :println);

Optional类

在这里插入图片描述
通过Optional类的方法就不用显示进行空值检测
在这里插入图片描述

创建Optional类对象的方法

of(T t) 的t必须非空,
empty()是创建一个空的
ofNullable(T t) 的t是可以为空
在这里插入图片描述


判断Optional容器中是否包含对象

获取Optional容器的对象

orElse(T other)中的参数是替补,如果调它的对象的空的,就返回这个other,这样就不会出现空指针异常的问题了。
在这里插入图片描述



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!