先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
1.7 接口中的默认方法和静态方法
在 JDK8 之前,接口中的方法只能声明无法实现,在 JDK8 中,接口中可以添加 默认方法和静态方法了。 首先介绍默认方法,通过 default 修饰的方法可以在接口中增加实现。
public interface MyInterface {
default void defaultMethod(){ System.out.println(“hello”); } }
另外是接口中的静态方法:
public interface MyInterface {
public static void staticMethod(){ System.out.println(“hello”); } }
更多的介绍会在后面的实验中给出。
1.8 Optional
Optional 类是 JDK8 的新特性,是一个可以为 null 的容器对象,Optional 往 往被用来做空值的判断。 集合类型的判空在某些场景下会十分啰嗦,比如当你接收到的 Map 是这样的
{“user”:{“info”:{“address”:“hz”}}}
这种时候如果按照常规的写法,需要写多层 if 语句进行判空
if (map.get(“user”)!=null){ Map user = (Map) map.get(“user”);
if (user.get(“info”)!=null){ Map info = (Map) user.get(“info”);
if (info.get(“address”)!=null){ String address = (String) info.get(“address”); System.out.println(address); } } }
if 里面套着 if,结构十分复杂,这个时候我们就可以使用 Optional
String address=Optional.ofNullable(map) .map(m->(Map)m.get(“user”)) .map(user->(Map)user.get(“info”)) .map(info->(String)info.get(“address”)) .orElse(null);
一下子就变得简洁明了。
1.9 新的时间日期 API
时间类一直是代码开发中经常用到的东西,时间类更新到 JDK8 版本期间,一共 迭代了三次。分别是 Date 类、Calendar 类和 LocalDateTime 类。 这一次推出来的 LocalDateTime 类,终于让 Java 中的时间类变得很好用了
import java.time.Instant;import java.time.LocalDate;import java.time.Loc alDateTime;import java.time.LocalTime;
public class DateTest {
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 表达式的使用,简化代码的编写。
知识点
-
匿名类
-
函数式接口
-
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 {
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ion should be final or effectively final
不过如果这个变量是对象变量或者静态变量,那么就没有不能修改的限制了。
public class AnonymousDemo {
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-2qgT7Jaj-1713183987367)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!