一、本期教学目标
- java8有哪些新特性
- 什么是函数式接口
- 什么是Lambda表达式
- 掌握Stream Api
- Stream和Collect集合区别
- Stream创建方式
- Stream操作三步骤
二、概述
上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要来玩点好的东西,那就是java8,我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新,虽然我们的JDK环境 也升级到了java1.8,但是在日常的开发过程中,使用最多的编程风格还是停留在 JDK1.7版本。
那对于java1.8,你们有了解多少它相关的新特性呢?至于java8,于2013年9月正式发布,距离至今已快十年载了,想必大家对它的新特性大大小小也耳濡目染了些吧?那么趁着今天这个空闲日子,我就跟大家一起来聊聊它-java8之新特性。
三、正文
1️⃣java8新特性
如下是java8几个主要的新特性总结,具体如下:
- Lambda表达式
- 函数式接口
- 方法引用与构造器引用
- Stream API
- 接口的默认方法与静态方法
- 新时间日期API
- 其他新特性
如下是我绘制的一个java8新特性思维导图,方便大家好保存浏览,对java8新特性也有一个概览了解。
2️⃣什么是Lambda表达式
耳熟能详,一直没去主动探索何为lambda表达式,这是你们有些人的心声吧,这次我就要替你们打破心声,让你们对此有一个肯定的解答,而不再是一问就给予说我项目中没有用到lambda表达式,那不可,就算项目没用,我们自己私下也得学起来啊,这不,这么有利的学习驱动力与免费资料,不学就浪费了啊。
那到底什么是lambda表达式?请听我一一道来。
lambda表达式,也称闭包,是java8中最大和最令人动容的语法改变。它允许将函数作为参数进行传递,比如传递给某个方法,也可以把本身代码当做数据处理。
其实呢,java支持lambda表达式,也算是比较晚了,在早期,比如jvm平台上的语言(Groovy、Scala等)从诞生之日起就已经支持 Lambda 表达式语法了。但是java并没有一诞生就支持,而是采用了匿名内部类来代替lambda表达式。
比如匿名内部类方式进行排序:
//匿名内部类方式进行排序
List<String> names = Arrays.asList("a", "c", "b","d");
names.sort(new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
});
可以看下运行结果:
如果换做lambda表达式来进行处理?那语句应该又是怎么写呢?我这里就给大家对比一下:
具体代码如下:
//lambda表达式排序
@Test
public void test1() {
//匿名内部类方式进行排序
List<String> names = Arrays.asList("a", "c", "b", "d");
System.out.println("排序前" + names);
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
System.out.println("排序后" + names);
}
可以看下运行结果:
前后对比一下,是不是非常的简洁,这就是lambda语法。其实这也得感谢大量为此贡献精力的社区跟开源大佬,是他们共同打造了java可实现简洁而紧凑的语言结构。才有我们这些后辈学习与使用,即,我们怎能不学习它了。
给大家总结一下,Lambda表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
然后对于lambda表达式编程风格,可总结为以下四类:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
如下,我给大家分别对于上述分类进行一下示例演示吧,这样你们就能看的更清晰点。
1️⃣可选类型声明
在使用过程中,可以不用显示声明参数类型,由编辑器识别类型。代码演示如下:
List<String> names = Arrays.asList("a", "c", "b", "d");
Collections.sort(names, (str1, str2) -> str1.compareTo(str2));
如果不由编辑器自动识别参数类型,你也可以手动指定该参数类型。代码演示如下:
List<String> names = Arrays.asList("a", "c", "b", "d");
Collections.sort(names, (String str1, String str2) -> str1.compareTo(str2));
二者运行结果是一致的! 这你们大家也可以去测试一下。
2️⃣可选的参数圆括号
当方法那只有一个参数时,无需定义圆括号。代码演示如下:
names.stream().forEach(p -> {System.out.println(p);});
当多个参数时,那就得需要定义括号。代码演示如下:
names.sort((p1, p2) -> p1.compareTo(p2));
3️⃣可选的大括号
当主体只包含了一行时,无需使用大括号。代码演示如下:
names.forEach( p -> System.out.println( p ) );
当主体包含多行时,需要使用大括号。代码演示如下:
names.forEach(p -> {
System.out.println(p);
System.out.println(p);
});
4️⃣可选的返回关键字
如果表达式中的语句块只有一行,可以不用return
,返回值的类型也由编译器自得。代码演示如下:
names.sort((e1, e2) -> e1.compareTo(e2));
如果语句块有多行,可以在大括号中指明表达式返回值。代码演示如下:
names.sort((e1, e2) -> {
int res = e1.compareTo(e2);
return res;
});
注意:如下内容,我将放在下一期进行教学讲解。本期就按上三个子标题的内容作为本期主要教学内容,想看下4个子标题内容的同学,可以看看我下期的教学内容哦,传送门-->《java零基础入门-java8新特性(下篇)》
3️⃣什么是函数式接口
...
4️⃣掌握Stream Api
...
5️⃣Stream和Collect集合区别
...
6️⃣Stream创建方式
...
7️⃣Stream操作三步骤
...