Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以 来最具革命性的版本。Java 8为Java语言、编译器、类库、开发 工具与JVM带来了大量新特性。
这次先简要的说一下其特性和其主要特点,后续再针对一些重要的特性继续加以代码进行详情更新。
jdk8的新特性有:
- 函数式接口
- Lambda表达式
- 方法引用/构造器引用
- 更强的Strean API
- 接口的增强
- Optional
- 新的时间和日期API
- 其它新特性,如注解中的重复注解、类型注解,HashMap底层的变化,JVM中Metaspace取代PermGen空间等
新特性特点:
- 速度更快
- 代码更少(增加了新的语法:Lambda 表达式)
- 强大的 Stream API
- 便于并行
- 最大化减少空指针异常:Optional
- Nashorn引擎,允许在JVM上运行JS应用
接下来先介绍函数式接口和Lambda表达式(因为Lambda表达式中要用到函数式接口,所以先介绍函数式接口)。
什么是函数式接口?
如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。
可以通过 Lambda 表达式来创建该接口的对象。(若Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽 象方法上进行声明)。
我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检 查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个 接口是一个函数式接口。
在java.util.function包下定义了Java 8 的丰富的函数式接口
Jdk8中关于Lambda表达式提供的4个基本的函数式接口:
代码体现:(消费型函数释接口)
@Test//消费型接口
public void test1(){
//消费型接口:(常规实现)
unforgettableTime(6000, new Consumer<Double>() {
@Override
public void accept(Double aDouble) {
System.out.println("2020年等疫情结束后要好好珍惜热爱生活,准备出去旅行,预计花费:" + aDouble);
}
});
System.out.println("********************");
//Lambda实现消费型接口:
unforgettableTime(9999,money -> System.out.println("医护人员太辛苦了,冒着生命危险去死神手里抢救同胞,应该象征性的奖励:" + money));
}
public void unforgettableTime(double money, Consumer<Double> con){
con.accept(money);
}
结果截图:
代码体现:断定型接口
@Test//断定型接口:过滤字符中含有“京”的字符串
public void test2(){
List<String> list = Arrays.asList("北京","南京","天津","东京","西京","普京");
//(常规实现)
List<String> filterStrs = filterString(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.contains("京");
}
});
System.out.println(filterStrs);
//Lambda实现断定型接口:
List<String> filterStrs1 = filterString(list, s -> s.contains("京"));
System.out.println(filterStrs1);
}
//根据给定的规则,过滤集合中的字符串。此规则由Predicate的方法决定
public List<String> filterString(List<String> list, Predicate<String> pre){
ArrayList<String> filterList = new ArrayList<>();
for(String s : list){
if(pre.test(s)){
filterList.add(s);
}
}
return filterList;
}
结果截图
什么是Lambda表达式,为什么使用它
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以
传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了
提升
Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操 作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符 或箭头操作符。它将 Lambda 分为两个部分:
左侧:指定了 Lambda 表达式需要的参数列表 右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能
例如:
1.举例: (o1,o2) -> Integer.compare(o1,o2);
2.格式:
-> :lambda操作符 或 箭头操作符
->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)
->右边:lambda体 (其实就是重写的抽象方法的方法体)
可能看定义比较抽象,下面用具体例子来体会一二Lambda表达式使用前后的对比:
代码体现:
@Test
public void test1(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("少年强则中国强");
}
};
r1.run();
System.out.println("***常规实现在上*****Lambda实现在下****");
Runnable r2 =() -> System.out.println("2020年中华民族通过抗疫再次向世界证明我们是团结的一家人");
r2.run();
}
结果如下:
代码体现:Comparetor接口的使用
@Test
public void test2(){
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare1 = com1.compare(12,21);
System.out.println(compare1);
System.out.println("***常规实现在上*****Lambda实现在下****
");
//Lambda表达式的写法
Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1,o2);
int compare2 = com2.compare(32,21);
System.out.println(compare2);
}
结果截图:
这篇的介绍就先到这,下一篇总结一下Lambda表达式的六种使用情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。