JDK1.8新特性:JDK1.8究竟有那些新特性呢
JDK1.8概述
JDK1.8,又称之为Java 8(我习惯叫它为JDK1.8,后续统一叫做JDK1.8),是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream API等。
JDK1.8相比1.7之前版本,有以下几方面的优化:
速度更快;
代码更少(Lambda表达式);
强大Stream API;
便于并行;
最大化减少空指针异常(OPtional类)。
举例如下,JDK1.8的特性是不是与众不同。
package com.xcbeyond.study.jdk8;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
/**
* JDK1.8新特性
* @Auther: xcbeyond
* @Date: 2019/11/27 0027 23:53
*/
public class Java8Test {
@Test
public void java8Example() {
// 定义一个整型list,对其进行遍历
Integer[] numArray={1,2,3,4,5,6,7,8};
List<Integer> numList= Arrays.asList(numArray);
/**
* 方式1:常规foreach
*/
for (int num : numList) {
System.out.println(num);
}
/**
* 方式2:JDK1.8 新特性写法(Lambda表达式)
* 代码量是不是少了很多
*/
numList.forEach((num) -> System.out.println(num));
}
}
新特性
JDK1.8新增了非常多的特性,本专题主要讨论以下几个:
Lambda表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法:默认方法就是一个在接口里面有了一个实现的方法。
新工具:新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
Stream API:新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
Date Time API:加强对日期与时间的处理。
Optional类:Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
Nashorn,JavaScript引擎:JDK1.8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
Lambda 表达式的结构
一个 Lambda 表达式可以有零个或多个参数
参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
空圆括号代表参数集为空。例如:() -> 42
当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
Lambda 表达式的主体可包含零条或多条语句
如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
Lambda 表达式重要特征
可选类型声明 - 无需声明参数的类型。编译器可以从该参数的值推断。
可选圆括号参数 - 无需在括号中声明参数。对于多个参数,括号是必需的。
可选大括号 - 表达式主体没有必要使用大括号,如果主体中含有一个单独的语句。
可选return关键字 - 编译器会自动返回值,如果主体有一个表达式返回的值。花括号是必需的,以表明表达式返回一个值。
小试牛刀
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是传统的写法");
}
}).start();
//------------------------------------------------------------
new Thread(() -> System.out.println("我是Lambda的写法")).start();
输出结果
Stream
Stream是一组用来处理数组,集合的API。
1.1 特性
不是数据结构,没有内部存储。
不支持索引访问。
延迟计算
支持并行
很容易生成数据或集合
支持过滤,查找,转换,汇总,聚合等操作。
1.2 运行机制
Stream分为源source,中间操作,终止操作。
流的源可以是一个数组,集合,生成器方法,I/O通道等等。
一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。
Stream只有遇到终止操作,它的源才会开始执行遍历操作。
1.1 Stream的创建
1.通过数组,Stream.of()
2.通过集合
3.通过Stream.generate方法来创建
4.通过Stram.iterate方法
5.其他API
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class CreateStream {
//通过数组,Stream.of()
static void gen1(){
String[] str = {"a","b","c"};
Stream<String> str1 = Stream.of(str);
}
//通过集合
static void gen2(){
List<String> strings = Arrays.asList("a", "b", "c");
Stream<String> stream = strings.stream();
}
//通过Stream.generate方法来创建
static void gen3(){
//这是一个无限流,通过这种方法创建在操作的时候最好加上limit进行限制
Stream<Integer> generate = Stream.generate(() -> 1);
generate.limit(10).forEach(x -> System.out.println(x));
}
//通过Stram.iterate方法
static void gen4(){
Stream<Integer> iterate = Stream.iterate(1, x -> x +1);
iterate.forEach(x -> System.out.println(x));
}
//其他API
static void gen5(){
String str = "abc";
IntStream chars = str.chars();## 标题
chars.forEach(x -> System.out.println(x));
}
}
日期和时间
- Instant 本质上是一个数字时间戳。可以从a中检索当前的Instant Clock。这对于某个时间点的日志记录和持久性非常有用。
- LocalDateTime 存储日期和时间。这会存储类似’2010-07-23T15:47:25.890’的日期时间。
- .ZonedDateTime 使用时区存储日期和时间。如果您想要考虑到日期和时间的准确计算ZoneId,例如“欧洲/巴黎”,这将非常有用。在可能的情况下,建议使用没有时区的更简单的类。时区的广泛使用往往会给应用程序增加相当大的复杂性
- LocalTime 没有日期存储时间。存储像’11:30’这样的时间,可用于存储开盘或收盘时间。
- Instant 本质上是一个数字时间戳。可以从a中检索当前的Instant Clock。这对于某个时间点的日志记录和持久性非常有用。
其他类型
- Month 用来存储一个月。这样可以隔离单个月份,例如“DECEMBER”。
- DayOfWeek 用来存储一个星期的日子。这样可以隔离存储一个星期几,例如“星期二”
- Year 用来存储一年。这样可以隔离一年,例如’2010’。
- YearMonth 用来存储年加月份的时间。这会存储一年和一个月,例如“2010-12”,并可用于信用卡到期。
- MonthDay 用来存储月份和日子。它存储月份和日期,例如“12-03”,可用于存储年度活动,如生日,而不存储年份。
Spring Data API
<!--java 8 time date 支持-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.0.12.Final</version>
</dependency>
MyBatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.1</version>
</dependency>