java8 新特性 快速理解
2017-11-04 19:46
246 查看
**
Lambda 需要函数式接口支持 接口用@Functiona1Interface 修饰,就是函数式接口
Lambda 操作接口(函数式接口:一个接口 就一个抽象方法)
Java 8 引入了新的操作符 “->”
该操作符把lambda 拆分成两部分
左侧 对应表达式的参数列表(接口所需要的参数,参数类型不需要写,jvm 会根据上下文推断,如jdk7后 List list = new ArrayList<>(); )
右侧 表达式中所需要实现的功能 (接口的实现)
语法格式一:无参数,无返回值
() -> System.out.println(“Hello Lambda!”);
语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator com = (x, y) -> {
System.out.println(“函数式接口”);
return Integer.compare(x, y);
};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator com = (x, y) -> Integer.compare(x, y);
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);
Void accept(T t);
2: Supplier《T》 供给型接口
T get();
3: Function 《T, R》 函数式接口
R apply(T t);
4 : Predicate(T) 断言型接口
Boolean test(T t);
核心函数只是体现接口,实现自己所需要的功能,根据功能场景选择函数接口,
如需要返回值供给型 (其他接口都是大同小异)
Lambda 表达式引用
1 方法引用:
a)若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用,可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
Supplier sup2 = emp::getName;
String name = sup2.get();
类名 :: 实例方法名
①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName
2 构造器引用
构造器的参数列表,需要与函数式接口中参数列表保持一致!
3 数组引用 类型[] :: new
Stream 是延迟执行 需要数据才执行,执行效率非常非常高。高效
获取Stream
得到想要的数据 中间操作都返回流
数据源
映射 map flatMap
map——接收 Lambda , 将元素转换成其他形式或提取信息。接收 一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
sorted()——自然排序(Comparable)
sorted(Comparator com)——定制排序
数据源’
一些常见的操作
归约 reduce
reduce——可以将流中元素反复结合起来,得到一个值。
经典操作 map-reduce 模式
最常用操作collect
collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
分组 groupingBy
分区 partitioningBy
Optional 容器类
LocalDate、LocalTime、LocalDateTime
Instant : 时间戳
Duration Period 时间运算
Duration : 用于计算两个“时间”间隔
Period : 用于计算两个“日期”间隔
TemporalAdjuster : 时间校正器
TemporalAdjusters 工具类提供实现的方法
DateTimeFormatter : 解析和格式化日期或时间
DateTimeFormatter 本身也提供很多时间格式
基础语法
**Lambda 需要函数式接口支持 接口用@Functiona1Interface 修饰,就是函数式接口
Lambda 操作接口(函数式接口:一个接口 就一个抽象方法)
Java 8 引入了新的操作符 “->”
该操作符把lambda 拆分成两部分
左侧 对应表达式的参数列表(接口所需要的参数,参数类型不需要写,jvm 会根据上下文推断,如jdk7后 List list = new ArrayList<>(); )
右侧 表达式中所需要实现的功能 (接口的实现)
语法格式一:无参数,无返回值
() -> System.out.println(“Hello Lambda!”);
语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator com = (x, y) -> {
System.out.println(“函数式接口”);
return Integer.compare(x, y);
};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator com = (x, y) -> Integer.compare(x, y);
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);
JAVA8 内置四大核心函数式接口
1: Consumer《T》 消费型接口;Void accept(T t);
2: Supplier《T》 供给型接口
T get();
3: Function 《T, R》 函数式接口
R apply(T t);
4 : Predicate(T) 断言型接口
Boolean test(T t);
核心函数只是体现接口,实现自己所需要的功能,根据功能场景选择函数接口,
如需要返回值供给型 (其他接口都是大同小异)
Lambda 表达式引用
1 方法引用:
a)若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用,可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
对象的引用 :: 实例方法名 调用类的getName()
Supplier sup2 = emp::getName;
String name = sup2.get();
类名 :: 静态方法名
类名 :: 实例方法名
①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName
2 构造器引用
构造器的参数列表,需要与函数式接口中参数列表保持一致!
3 数组引用 类型[] :: new
强大的Stream API
Stream 是一个抽象流的概念 ,生成流后通过中间操作数据源(集合,数组)产生 一个新的元素序列。就像SQL一样Stream 是延迟执行 需要数据才执行,执行效率非常非常高。高效
获取Stream
中间操作
对流进进行一些列操作 ,得到自己想要的流数据,像SQL 对数据进行 过滤 求和得到想要的数据 中间操作都返回流
数据源
映射 map flatMap
map——接收 Lambda , 将元素转换成其他形式或提取信息。接收 一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
sorted()——自然排序(Comparable)
sorted(Comparator com)——定制排序
终止操作
当执行终止操作,中间操作会一次性执行,没有执行终止操作,中间操作就是个摆设数据源’
一些常见的操作
归约 reduce
reduce——可以将流中元素反复结合起来,得到一个值。
经典操作 map-reduce 模式
最常用操作collect
collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
分组 groupingBy
分区 partitioningBy
Optional 容器类
JDK8 全新的时间API
JDK8 他是线程安全的 ,不管怎么转换 都是生成一个新的实例。LocalDate、LocalTime、LocalDateTime
Instant : 时间戳
Duration Period 时间运算
Duration : 用于计算两个“时间”间隔
Period : 用于计算两个“日期”间隔
TemporalAdjuster : 时间校正器
TemporalAdjusters 工具类提供实现的方法
DateTimeFormatter : 解析和格式化日期或时间
DateTimeFormatter 本身也提供很多时间格式
相关文章推荐
- java提高篇(一)-----理解java的三大特性之封装
- java提高篇之理解java的三大特性——多态
- javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
- (转)java提高篇(二)-----理解java的三大特性之继承
- java提高篇(二)-----理解java的三大特性之继承
- java提高篇(一)-----理解java的三大特性之封装
- Java 9 新特性快速预览
- java提高篇(三)-----理解java的三大特性之多态
- 深入理解JVM内幕:从基本结构到Java 7新特性
- Java8 的一些新特性的学习理解
- java中面向对象思想和三大特性的理解
- java提高篇(二)-----理解java的三大特性之继承
- java提高篇(四)_理解java的三大特性之多态 转自 http://cmsblogs.com
- java提高篇-----理解java的三大特性之封装
- 简述Java中Class类的作用与快速理解
- 理解java的三大特性之多态
- java提高篇(三)-----理解java的三大特性之多态
- 深入理解JVM内幕:从基本结构到Java 7新特性
- Java 9 新特性快速预览
- 深入理解Java面向对象三大特性 封装 继承 多态