JDK1.8新特性

来源:互联网 发布:深圳网络布线 编辑:程序博客网 时间:2024/05/29 08:43
jdk1.8的新特性打破了许多原有的设计方案。
接口方法定义扩展
接口使用问题:一个接口可有多个子类,假设接口中有三万个子类,若有一天接口缺了个方法,所有子类实现相同,此时需要将方法实现3W次
核心问题在于:接口只是一个方法的声明,而没有实现,若出现以上问题,接口无法使用·
从JDK1.8开始,提供了两类新结构:
1、使用default定义普通方法,需要通过对象(m)调用
2、使用static定义静态方法,通过接口名即可调用

此时的接口更加像抽象类,但最大的不同还是:接口的子类依旧是多继承,而抽象类只能实现单继承。
当一个接口的子类十分多时,才考虑用此扩充功能,但此操作不属于标准设计,而属挽救设计。

Lambda表达式
jdk1.8开始的重要新特性,很多开发语言都支持函数式编程,最具代表性的是haskell,很多人觉得面向对象的概念过于完整,结构操作不明确
例子:使用匿名内部类实现接口,最大好处:节约一个类文件,缺点:看的晕

于是对于此类操作有了更简化的实现,使用函数式编程Lambda

面向对象语法最大的局限在于结构必须非常完整。
但如果要使用函数式编程有一个前提:接口必须只有一个方法,一个以上无法使用
若有一个接口就是为Lambda编程而生的,最好定义的时候就限定其只能有一个方法,所以出现一个新注解:@FunctionInterface,以便在定义时就发现错误。
实际上对于以上语法形式:
  • (参数) -> 单行语句
代码对应关系:
此时方法本身中只包含一行,就直接写
若方法中包含多行语句,则需要用{}
  • (参数)->{多行语句 。。。}
若表达式中只有一行进行返回,则可直接使用语句,不必写return

不习惯慢慢习惯,行业内有一家公司基于java做了一套函数式编程语言:scala
最终解析完是java,一般拿来做数据分析。
方法引用(Lamada的补充)
从最初,只要进行引用都是针对引用类型而言的,只有数组,类,接口具备引用操作,
现在追加了方法引用的概念。
引用的本质就是别名,所以方法引用也是别名使用,有四种形式
  • 引用静态方法:类名称 :: static 方法名称
  • 引用某对象的方法: 实例化对象 :: 普通方法名
  • 引用某个特定类的方法: 类名 :: 普通方法
  • 引用构造方法: 类名 :: new
例子:引用某特定类的方法

直接使用现有函数,相当于为方法起了个别名
例子:引用某对象的方法

例子:引用类中普通方法

例子:引用构造方法

不太好用,想用就用
内建函数式接口(JDK1.8已经提供了一系列的函数式接口)
Lambda实际上为了简化方法引用而存在,Lambda的核心在于函数式接口,函数式接口的核心在于该接口只有一个方法。实际上在函数式编程中只需要四类接口,jdk1.8中提供了java.util.function包,其中有下列四类函数式接口:
  • 功能型函数式接口(唯一方法有参T有返回值R)
输入数据,数据处理后输出
public interface Function<T,R>{
R apply(T t)
}
  • 供给型函数式接口(唯一方法无参有返回值R)

public interface Supplier<T>{
T get();
}
  • 消费型函数式接口(唯一方法有参T无返回值)
public interface Consumer<T>{
void accept(T t);
}
  • 断言型函数式接口(唯一方法有参T返回boolean值)
public interface Predicate<T>{
boolean test(T t);
}
方法无参无返回值,有参无返回值,无参有返回值,有参有返回值
使用功能型函数式接口Funciton(String.valueof):

还提供了一些扩展的函数式接口(限定了参数或者返回值):

使用供给型函数式接口("hello".toUpperCase):

使用消费型函数式接口(syso):

使用断言型函数式接口(isEmpty):

提供这些接口只是把操作标准化,大不了自己写接口

参考:阿里云栖李兴华老师java基础高级视频