JDK1.8新特性
欢迎使用Markdown编辑器
JDK1.8新特性:
Lambda表达式
函数式接口
方法引用
接口的默认方式和静态方法
Optional
Streams
Lambda表达式
Lambda 表达式,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。可以使代码变的更加简洁紧凑。
⒈基本语法
(参数列表) -> {代码块}
需要注意:
· 参数类型可省略,编译器可以自己推断
· 如果只有一个参数,圆括号可以省略
· 代码块如果只是一行代码,大括号也可以省略
· 如果代码块是一行,且是有结果的表达式, return 可以省略
注意:事实上,把Lambda表达式可以看做是匿名内部类的一种简写方式。当然,前提是这个匿名内部类对应的必须是接口,而且接口中必须只有一个函数!Lambda表达式就是直接编写函数的:参数列表、代码体、返回值等信息
⒉用法示例
假设我们要对集合排序,我们先看JDK1.7的写法,需要通过匿名内部类来构造
如果是jdk1.8,我们可以使用新增的集合API:sort(Comparator c) 方法,接收一个比较器
示例2:单个参数
还以刚才的集合为例,现在我们想要遍历集合中的元素,并且打印。
jdk1.8给集合添加了一个方法:foreach() ,接收一个对元素进行操作的函数:
实例3:把Lambda赋值给变量
Lambda表达式的实质其实还是匿名内部类,所以我们其实可以把Lambda表达式赋值给某个变量。
Lambda表达式是接口的匿名内部类的简写形式
⒈Function类型接口表的是有参数,有返回值的函数。还有很多类似的Function接口:
⒉Consumer系列
Consumer系列与Function系列一样,有各种衍生接口,这里不一一列出了。不过都具备类似的特征:那就是不返回任何结果。
⒊ Predicate系列
方法引用
方法引用使得开发者可以将已经存在的方法作为变量来传递使用。方法引用可以和Lambda表达式配合使用。
⒈语法
总共有四类方法引用
· Function<T,R> :函数接口,接收T类型,返回R类型。用这个函数接口对list中的元素T进行转换,变为R类型
① 类的静态方法引用
② 类的非静态方法引用
接口的默认方法和静态方法
Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。
⒈默认方法
默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。
默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写
⒉ 静态方法
可选类型(Optional)语法:
如果g为空,将c赋值为456,否则将j的值赋d:
var d = c ?? 456
用!和?定义的区别:
Int ?*:必须使用!拆包(取值)
Int!:自动拆包取值
当一个类没有创建构造函数时,编译器自动生成一个无参构造函数;一旦创建自定义构造函数,编译器将不会再自动生成无参构造函数。
class与结构体的区别:
用let定义的结构体变量,成员不能修改
结构体是值类型的,在赋值的时候会发生复制
类是引用类型
结构体的成员方法需要加mutating才能修改成员变量,类科研直接修改
streams:
java引入Stream之后所有的集合类都添加了一个stream()方法
如果我们想使用多线程来处理集合类的数据,Stream提供了非常方便的多线程方法
Stream的操作可以分为两类一类是中间操作中间操作返回Stream,因此可以级联调用另一类是终止操作,这类操作会返回Stream定义的类型。