2024年Go最新一文带你攻克JDK新特性(1),全球最火的程序员学习路线

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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)**

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值