jdk1.8新特性
1.Lambda表达式
1.简介
语法糖 也叫作糖衣语法
指的是 在计算机语言中 添加某种语法
这种语法 能使程序员更方便的使用语言开发程序
同时,增强了代码的可读性 避免了出错的机会
但是,这种语法对于语言的功能并没有增强
泛型 <>
自动装箱拆箱
增强for循环
2.Lambda表达式 λ
本身就是数学的概念
也叫作 目标类型(target type)
3.语法格式
基本格式
(参数列表)->{方法体};
解释:
1. “->” 表示 转为/成为
左边指定输入的参数 右边是Lambda的方法主体
2.()形参列表 0个/N个
3.{}是方法体语句
注意:
1. 只有是函数接口(当一个接口中 只包含一个方法时 该接口叫做函数接口) 才能使用Lambda表达式替换
格式:
()->{}
1.(参数列表)->表达式
花括号可省略 省略后 不能书写return关键字
2.形参列表的类型声明 可省略 java在编译的时候 会根据上下文 自动推断出参数类型
3.小括号可省略 形参列表是一个的时候可省略
4.return关键字
如果是单一表达式 可不写
如果写了return 就必须写花括号
4.Lambda表达式的基本应用
4.1 线程中的使用
4.2 forEach方法在集合中的使用
Iterable 1.8新增方法
default void forEach(Consumer super T> action)
Map 1.8新增方法
default void forEach(BiConsumer super K,? super V> action)
4.3 集合的排序
List集合出现自有的排序方法sort() 可根据Comparator比较器顺序进行排序
4.4 数组的排序
4.5 特殊的双冒号:: 方法引用
这是java8的Lambda表达式写法 叫做方法引用 (method references)
是Lambda的简写形式
注意:
1.是Lambda的简写形式
2.调用一个已存在的方法
3.当我们需要引用的方法传入其他类型参数的时候 不适合
语法:
左边是容器(类名/实例名)
中间::
右边是要调用的方法名
1.非静态方法调用
对象的引用::方法名
想要调用该对象所属类的一个已存在方法
例如:
Object obj = new Object();
obj.equals(o2);
方法引用
obj::equals;
Person类 getName()方法
Person p = new Person();
p.getName();
Lambda写法
(Person p)->p.getName();
方法引用
p::getName;
2.静态方法调用
类名::方法名
例如:
String.valueOf(i)
Lambda
(i)->String.valueOf(i);
简写模式
String::valueOf
3.构造方法调用
类名::new
Student s = new Student();
例如:
String s = new String();
()->new String();
方法引用
String::new
2.局部内部类中变量的修饰符
final修饰符可省略
内部类在访问 它所在的方法中的变量时 该变量必须是常量(被final修饰的)
jdk1.8之后 省略了final修饰符 但是本质上该变量还是final的
3.接口支持静态方法 与 默认方法
static
default
接口中的方法 可以用 abstract / default / static 修饰
修饰符不能混合使用
被abstract修饰的方法 子类必须重写
被default/static修饰的方法 子类可以选择性重写
重写default修饰的方法时 权限修饰符必须是public
4.Time包下的类
jdk1.8新增了一些处理时间问题的专门类
Time包下
LocalDate 代表的是 不带时间的日期 yyyyMMdd
LocalTime 代表的是 不带日期的时间 HH:mm:ss
LocalDateTime 包含了日期与时间 不过没有带时区
ZonedDateTime 包含了 日期与时间 带时区
…
5.Stream接口
和Iterator很像
Stream (流) 和 InputStream/OutputStream 没有关系
Stream 表示能应用在一组元素上一次执行的操作序列
Stream 提供了很多Lambda表达式方法
操作分为 中间操作 和 最终操作两种
中间操作 返回 —> Stream 本身
filter / stream / distinct / sorted
最终操作 返回 —> 一个特定类型的计算结果
count / iterator / limit / match / max / min / findFirst / collect
创建一个Stream 需要指定一个数据源 比如Collection的子类
List 和 Set
Map不支持