JDK-8新特性

195 阅读4分钟

image.png

接口的新特性

抽象方法

之前传统的方法且没有方法体

static方法

  • 使用static修饰接口中的方法中必须有方法体

  • 只能够被接口本身调用(实现类能被接口调用的仅此一个);语法:接口名.方法名(...)

  • 不能被子接口继承;

  • 不能被实现类覆写及直接调用;

default方法(默认方法)

  • 使用default修饰接口中的方法并且必须有方法体

  • 不能够被接口本身调用,需要接口的实例(实现类对象)来调用

  • 可以被子接口继承、覆写或者直接调用

  • 可以被实现类覆写及直接调用

函数式接口

  • 有且仅有一个抽象方法的接口(只看抽象方法个数,与静态和默认方法个数无关),
  • 可以使用注解@FunctionalInterface标记该接口为函数式接口

image.png

Lambda表达式

简述

简写的匿名内部类

Lambda语法

<函数式接口> <变量名> = (参数1,参数2...) -> {

//方法体

}

匿名内部类写法

image.png

写法一:常规写法(无参)

由匿名内部类变化而来,可以看做把方法列表和方法体抽离出来,具体是从=右边开始删除,删除到方法名,入参的()和方法体{}之间用->链接,方法体只有一句代码的时候,{}可以删除
例子

image.png

写法二:有参

没有返回值

  • 如果只有一个入参,入参的类型可以删除,入参的()可以删除

image.png

  • 如果有多个入参,入参类型可以删除(要删除就把参数类型全都删除),()不能删

image.png


有返回值

  • 有返回值,并且方法体中只有一句代码(传参变量){}和return一起删除

image.png

方法引用

构造方法引用

  • 语法:类名::New
  • 被构造方法与函数式接口的抽象方法参数列表一致

举例

  • 第一步: 先创建一个提供两个参数的构造方法的类,如User类
  • 第二步: 创建User对象的方法接口(命名为工厂UserFactory),提供一个获取User对象的抽象方法

image.png

  • 创建一个工厂接口的实例

image.png

静态方法引用

语法:类名::静态方法名

注意事项

  • 被引用的静态方法参数列表和函数式接口中抽象方法的参数一致
  • 接口的 抽象方法没有返回值,引用的静态方法可以有返回值也可以灭有返回值
  • 接口的抽象方法有返回值,引用的静态方法必须有相同类型的返回值

举例

  • 准备一个函数式接口,提供一个解析字符串为int(即把字符串转换为int)的方法

image.png

  • 测试
    常规Lambda写法

image.png Lambda静态方法引用 image.png

实例方法(普通方法)

java提供了一个断言型函数式接口Function,接受两个参数

image.png 对象名::方法名

注意(和静态方法一样)

  • 被引用的静态方法参数列表和函数式接口中抽象方法的参数一致
  • 接口的 抽象方法没有返回值,引用的静态方法可以有返回值也可以灭有返回值
  • 接口的抽象方法有返回值,引用的静态方法必须有相同类型的返回值 流式编程

举例

image.png

Stream流

是对集合Collection进行操作
首先的获取集合的流(使用对象名.stream()),下面所有方法都是需要在这基础上进行操作

常用方法

foreach(取出流中的每个数据)

迭代流中的每个数据 使用获取流的对象名.foreach(sout)

image.png

filter

筛选出符合条件的元素

image.png

map

获取每个元素到对应的结果

image.png

limit

获取指定数量的流,打印输入数量的数据

image.png

sorted

筛选年龄大于12的前两个人

image.png 注:要先进行筛选,然后才用Map

并行流parallelStream

  • 上面的都是串行流(就像电路串联一样,电流流过一个负载没短路才能继续流向下一个负载)
  • 只是把Stream换成parallelStream,方法和Stream一样

串行流和并行流的区别

  • 串行流(保证数据的顺序) 并行流(效率高,不能保证数据顺序) ,因此并行流不能进行数据正常排序
  • 串行流如果报异常,不容易发现是哪一个异常,排错困难

规约操作(Collectors)

  • 将流转换为一个常用的类,方便别人使用
  • 转换为List集合:在流最后使用Collect(Collectors.toList())

例子:(转换为字符串)

image.png

时间日期

image.png

Optional容器类

介绍

是一个可以为null的容器类

常用方法

方法描述
Optional.ofNullable(T t)若t不为null,创建Optional实例,否则创建空的实例
isPresent()判断是否包含值
orElse(T t)如果调用对象包含值,返回该值,否则返回t
Optional.ofNullable(T t)

避免空指针异常

image.png

image.png