网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
public static void main(String[] args) { Instant now = Instant.now();
//获取纳秒级别的时间戳
System.out.println(now.toEpochMilli());LocalDate localDate=LocalDate.now(); LocalTime localTime=LocalTime.now(); LocalDateTime ldt = LocalDateTime.now(); System.out.println(localDate); System.out.println(localTime); System.out.println(ldt); } }
大家能猜出上面的这段代码会返回怎样的数据吗?
1.10 实验总结
本次实验对 JDK8 中的一些重要特性做了简单的介绍,可以看到这些新特性让 Java 变得更加有趣了。在接下来的实验中,针对上述的内容会有更详细的介绍。
### 2.学透 Lambda 表达式
#### 2.1 实验介绍
Java8 是一个跨时代的更新,在这个版本中,出现了很多新特性,其中 Lambda 表 达式就是 Java8 中十分重要的新特性。本次实验将基于 Java8 详细介绍 Lambda 表达式的使用,简化代码的编写。
知识点
1. 匿名类
2. 函数式接口
3. Lambda 表达式介绍
4.Lambda 表达式的变量作用域
5.Lambda 表达式在实际中的应用
#### 2.1 匿名类
在正式介绍 Lambda 表达式之前,首先需要知道的一个知识点是匿名类。 因为 Java 中的 Lambda 表达式最重要的用法就是简化匿名类的使用。匿名类 可以同时声明和实例化一个类,匿名类和本地类十分相似,只是匿名类没有名称。 比如下面有一个叫 Person 的接口,里面有一个 sayHello 方法
public interface Person {
void sayHello(); }
接着创建一个类 Son 实现 Person 接口,实现里面的 sayHello 方法。 在不用匿名类的情况下,就需要新建一个类实现 Person,然后重写 sayHello 方 法,就像下面这样
public class Son implements Person{
@Override
public void sayHello() { System.out.println(“son say hello”); } }
如果这个 Son 类只是用来在某个类中执行特定任务的话,就可以使用更加简洁 的匿名内部类写法,而无需创建这个 Son 类
public class AnonymousDemo {
public static void main(String[] args) { Person person = new Person(){
@Override
public void sayHello() { System.out.println(“anonymous say hello”); } }; person.sayHello(); } }
在上面这个例子中,虽然没有创建实体的类,但是通过一个匿名类的方式实现了 本地类的效果。总结下来,匿名类是不能有名字的类,它们不能被引用,只能在 创建时用 new 语句来声明它们。
#### 2.2 函数式接口
在正式学习 Lambda 表达式之前,还有一个很重要的概念需要了解,那就 是函数式接口。函数式接口主要就是给 Lambda 表达式使用的。 函数式接口可以使用 @FunctionalInterface 来修饰,如果一个接口是函数式接 口,那么这个接口就可以使用 Lambda 表达式来写。 函数式接口有下面几个特征:
. 只能有一个抽象方法。
. 允许定义默认方法
. 允许定义静态方法
. 允许定义 java.lang.Object 里的 public 方法
拿 java.util 包下的 Comparator 接口举个例子,下面是这个接口的一部分代码
@FunctionalInterfacepublic interface Comparator {
int compare(T o1, T o2);
boolean equals(Object obj);
default Comparator reversed() {
return Collections.reverseOrder(this); }
public static super T>> Comparator reverse Order() {
return Collections.reverseOrder(); } }
从代码中可以看到,Comparator 完美符合了函数式接口的特性,只能有一个抽 象方法 compare,有默认方法,有静态方法,有 java.lang.Object 里的 public 方 法。
#### 2.3 Lambda 表达式
匿名类的一个问题是,如果匿名类的实现非常简单,例如只包含一个方法的接口, 那么匿名类的语法可能看起来笨拙且不清楚。因此 Lambda 表达式出现了,
Lambda 允许通过表达式来代替功能接口,使用 Lambda 可以让代码变得更加 简洁。
Lambda 只能在函数式接口中使用,上面这段使用匿名类的方法,换成 Lambda
表达式之后就变成了下面这样:
public class AnonymousDemo {
public static void main(String[] args) { Person person = () -> System.out.println(“anonymous say hello”); person.sayHello(); } }
一下子变得更加简单了。
Lambda 表达式的语法格式如下所示:
(parameters) -> expression
或
(parameters) ->{ statements; }
lambda 表达式的写法主要有下面几种
无参数,无返回值
开头的例子中就是一个无参数和无返回值的写法,在这个例子中,接口中定 义的抽象方法没有入参也没有返回值:
public class AnonymousDemo {
public static void main(String[] args) { Person person = () -> System.out.println(“anonymous say hello”); person.sayHello(); }}
有参数,无返回值
先写一个这样的接口:
public interface Student {
void getAge(int age); }
在以前的代码中,需要首先写一个类去继承这个接口,或者是写一个匿名内部类, 如:
Student student=new Student() {
@Override
public void getAge(int age) { System.out.println(age); } };
使用 Lambda 就变得简单了
Student student2=(age) -> System.out.println(age);
如果只有一个参数,小括号可以不写
Student student3=age -> System.out.println(age);
如果想要在 Lambda 表达式中写一些复杂的方法,在语法上可以在大括号内部 写实现方法。
public class Main {
public static void main(String[] args) { Student student4 = age -> {
// do something
System.out.println(age); }; student4.getAge(10); } }
上面的这段代码最终会输出 10。
有参数,有返回值
首先写一个有参数,有返回值的接口方法
public interface Student {
int getAge(int age); }使用 Lambda 表达式时代码如下
public class Main {
public static void main(String[] args) { Student student = age -> {
return age * 5;};
int age = student.getAge(10); System.out.println(age); } }
在上面的代码中,由于 Student 的 getAge 方法是有返回值的,因此在写带有 大括号的实现方法时也必须带上 return。 如果实现方法用单行代码就能写完,可以将大括号和 return 进行简化,代码就 变成了下面这样:
public class Main {
public static void main(String[] args) { Student student = age -> age * 5;
int age = student.getAge(10); System.out.println(age); } }
#### 2.4 Lambda 表达式的变量作用域
Lambda 内部如果使用了外部定义的局部变量,那这个变量是一定不能被修改的, 看下面这段代码
public class AnonymousDemo {
public static void main(String[] args) {
int num = 1; Person person = ()->{
int a = num; }; num++; } }
在 Lambda 表达式中使用了 num,又在外部对 num 进行了修改,就会出现下 面这段报错
Variable used in lambda expression should be final or effectively final
不过如果这个变量是对象变量或者静态变量,那么就没有不能修改的限制了。
public class AnonymousDemo {
static int num = 1;
public static void main(String[] args) { Person person = ()->{
int a = num; }; num++; }}
#### 2.5 Lambda 表达式在实际中的应用
在 JDK8 中,有许多接口都可以使用 Lambda 表达式来简化代码的编写,接下 来介绍几个常见 Lambda 的使用场景。
Runnable 接口
从 Runnable 接口的源码中可以看到,这个接口是用 @FunctionalInterface 修 饰的,意味着它可以使用 Lambda 表达式。 普通的匿名类写法是这样的:
public class AnonymousDemo {
public static void main(String[] args) { Runnable runnable = new Runnable() {
@Override
public void run() { System.out.println(“do something”); } }; Thread thread = new Thread(runnable); thread.start(); } }
使用 Lambda 表达式后,写法就变成了下面这样
public class AnonymousDemo {
public static void main(String[] args) { Runnable runnable = () -> System.out.println(“do something”); Thread thread = new Thread(runnable); thread.start(); } }
如果再精简一点,使用一行代码就可以搞定
public class AnonymousDemo {
public static void main(String[] args) {
new Thread(() -> System.out.println(“do something”)).start(); } }
Comparator 接口
Comparator 是一个用来排序的接口,比如可以对 List 集合进行自定义排序:
![img](https://img-blog.csdnimg.cn/img_convert/e07ea48788bf97441a323676b4a5ae87.png)
![img](https://img-blog.csdnimg.cn/img_convert/56f6cd2dea6cbeea99824d00c9478b43.png)
![img](https://img-blog.csdnimg.cn/img_convert/ee031c262724bc03b21823fa455788b4.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
口,比如可以对 List 集合进行自定义排序:
[外链图片转存中...(img-INQkq6Yr-1715642545855)]
[外链图片转存中...(img-rN9gJMXS-1715642545855)]
[外链图片转存中...(img-r4TJtMTG-1715642545855)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**