00:00
那么下边的话呢,咱们来讲讲这个GD8这个新性啊,我们前面呢提到说GD8呢,是第二重要的里程碑的版本了,第一呢GDKGD呢已经融到了咱们前面呢讲解相关的内容当中了,诶GD8呢我们也融了一些,但是还有一些呢没有讲,而且呢还是我们GD8里边呢最重要的两个新特性,所以这块呢,我们针对G8呢做一个说明,这儿呢我放了一个诶思维导图里边呢,就列出来了,我们GD8里边呢主要的一些新特性。啊,这样一看的话呢,还挺多的哈,那其中我们讲过了一些了,比如说接口里边的这个静态方法,默认方法对吧。诶,然后这块啊,提到我们那个内存空间的一个变化啊,这个我们提到了啊,这个也讲了是吧。新的日期时间API啊也说了啊呃,这个新特性啊,你注意我们没必要呢,每一个你都得给他整的透透的,完全没必要啊,甚至有些呢,你可能一直就没有用过啊,所以我们一定呢得抓最重要的一种啊,包括每天咱们说学习也是一样哈,你就抓重点,重点呢,可能他只按这个知识点来讲呢,可能只占30%是吧,但是它这个出现的频率呢,可能在代码中呢,达到90%以上,那你肯定是要抓这个重点的,毫无疑问啊。
01:08
行,那这呢,我们先泛泛的去看一看GT8的这个新特性啊,能够使得我们这个整个的这个写的代码能怎么着呢,第一个叫速度更快。哎,速度更快呢,一方面呢,底层的一些啊,GM啊JC啊是吧,一些优化这个每个版本都会有的啊嗯,然后另外一个点的话,你比如说我们这个哈希map。咱们呢把它呢从这个数组加列表改成了叫数组加列表加红黑数了,那显然呢,我们再进行相关的比如put呀,Get呀,Remove啊啊这样一些操作的时候呢,我们速度就会更快一些啊,就是数据结构的一个变化,然后下一个呢叫代码更少,这呢也是我们等下呢主要要讲的叫拉姆达表达式,另外一个呢,叫强大的死string API这块呢,有一个修饰词。啊,什么叫强大,强大到哪了,那这个咱们说到这儿的时候呢,大家来感受一下啊,下边这个呢,叫便于并行,那并行的话呢,相当于我们就可以呢,有点类似于像多线程一样啊,我们可以同时呢去做相关的这个数据的一个处理了,显然呢,这个速度会更快一些。
02:07
啊,比如我们在这个中一篇里边呢,我们也可以呢,去通过这样的方式,是不是来获取一个叫并行瘤嘛,啊这个我们讲到这儿的时候呢,到时候我们稍微的演示一下啊。好,下边就提到了说最大化的减少控制人的异常,提到一个类呢,叫optional,这个类OK啊,讲到这的时候我们再说,那下边这块又提到一个说叫ne how这样一个引擎,它呢允许在GM上呢去运行GS的一个应用。啊,这个GM的话呢,以前我们稍微也提到过一下啊,说呢,它现在其实已经不局限于是运行Java程序了。啊,所以呢,从这个角度来讲呢,我们叫GM这个勾呢,其实就是Java的意思了,现在其实呢,这个不完全是这个Java了,呃,其实能运行很多我们常见的这个应用程序啊,行,那比如说这块呢,可以运行这个GS啊简单的体会一下啊注意这块我们说的是JTK8的这个新特性,打开以后呢,我这呢就写了一个非常简单的一个,哎,放点GS这里边呢,实际上呢,是定义了一个函数哈。
03:02
这个稍微的,我们把它打开来看一眼。那很简单,这样定一个函数,这个函数呢,一调它的时候呢,就返回一个一是吧,然后呢,这块我们print呢,就打印一下,调这个函数返回一个一,一加一,这个结果呢就是二。哎,后边呢,我们讲到这个GS呢,到时候再说这个事儿啊好,这呢是一个GS程序了,说呢,我们在这个JDK当中,我们整个这个GM呢,是可以来运行这个DS的啊,那这块我们可能就想到了,直接在这儿呢,是不是CMD一下。哎,然后这块呢,怎么去调呢,它用的这个指令呢,像咱们Java呢,就叫编译,这叫运行,哎这块我们叫诶勾勾S。啊勾勾S啊好,后边这块你就把这个叫放点GS写到这就可以了,注意你看这时候能不能成功啊走起。发现他是不是就。说呢没有这个指令是吧,正常来讲呢,咱们已经配过环境变量了啊,但这块你要注意咱们配的环境变量呢,是JDK17是吧。哎,这这个17里边呢,相当于就没有,因为呢给删了。
04:02
啊,所以呢,通过这呢,大家也体会一下,有好多这新特性呢,后续的版本呢,都做了一些变化啊,那咱们回过来看一下我这个JDKJDK里边呢,咱们找一下这个八是吧,八这里边呢,我们看一下这个bin哈,里边你去找这个叫勾勾S是不是它嘛。嗯,然后呢,你要是放在这个GDP17里边呢,你去这个B下边就找就找不着了啊,说白就删掉了啊,那你要想测试的话呢,你只能是把这个路径是不是配到我们这个环境变量里边是吧。哎,稍微的咱们就说一下就行啊。欢迎面料熟悉一下啊,怎么配置?那找到这,然后呢,我们这个Java home是吧,这个我就替换一下了,替换完以后呢,我在这个pass里边,这不我把它放到最上面了吗?好确定一下,确定确定好这没问题了,然后呢,注意这块,我们重新的再去开一个这个命令行的这个窗口啊,诶不是它了。前面这个。哎,这时候我们在CMD一下,你再来一个勾勾S,这个呢,我们就放个点GS,哎,这不一执行就出来了吗。诶,这个呢是GD8里边是有的,这这个时期呢就删掉了啊,所以呢,我们前面也都提到过了,有很多这个新的性呢,在后续啊,在这个版本当中都有一些变化,下边呢,就是简单的说明了一下啊呃,这个奈号的话呢,也是替代了以前的那叫reno这样一个引擎。
05:13
啊re的太慢了,就替换了,然后呢,在JK9里边儿呢,对这个引擎呢,做了一个改进啊让你以为呢说它挺受重视的,结果呢,在11当中呢就被标识为过时了,实物当中呢就直接呢给删掉了,所以我们在实习当中呢,你就找不到了。那删掉以后你得有替换呀,在GT11当中呢,我们引用了这个叫啊GVM这个呢,诶是非常强大的,这个我们不在基础阶段讲了,它其实可以去运行非常多的,哎,我们说的这个语言了。啊,这个呢,就提到这样的一个新的这样一个虚拟机了啊。好,这就过掉了啊,咱们现在呢,重点要给大家讲的呢,其实就是说的这个事儿叫拉姆达表达式。在到目前为止还不知道他到底是干什么的是吧?哎,先让大家呢,直观的感受一下啊。这个呢,这是前段时间的一个学生发给我的这个代码,呃,这个代码里边呢,大家能看到的这里边儿,比如说你带了一个箭头这个。
06:08
是吧,包括这个冒号,冒号这个这个在咱们前面呢,都没有讲过这样的语法结构。啊,这个带箭头,这呢其实就是拉姆达表达式这个冒号,冒号呢相当于拉曼达表达式的进一步的刻画,叫做方法引用。所以呢,你看这个代码呢,通篇都是拉姆达表达式和方法引用这样的结构。非常的酸爽是吧,哎,如果你要不懂的话呢,这个完全就看不懂了,这个呢,是跟他聊的时候呢,这样的一个截图。说玩的好的话呢,就会觉得很厉害,不会玩的话呢,是真看不懂啊。啊,以前呢,咱们讲这个拉姆达表示,包括后边这个stringpi的时候呢,呃,一般我都说呢,大家了解一下就行。是吧,哎,现在的话呢,不能是这样了,这个呢,需要大家还得要重点掌握的,基于两点,第一个点啊,以后呢,我们去看一些框架,看源码,源码里边呢,这是JDK8的新特性啊,一四年发布的,到现在已经很长时间了。
07:01
所以呢,这个框架的源码呢,不断的去迭代更新,他们呢,在源码当中也使用了拉姆达表达式方法应用,所以呢你要能够看到源码。哎,你就得会把来表示。这是其一,其二的话呢,就是在实际开发当中啊,确实呢,也可以去应用了啊,用拉表示去写呢,非常的方便。啊,当然了,也ID呢,就是我们也可以不用啊,不用的话呢,你写起来就比较费劲,用的话呢就非常方便,但是从那个可读性上来讲呢,似乎的差一点是吧。但是呢,反正方便,自己能看得懂别人看不懂别人就去学呗。是吧,就成这么个特点啊,所以这块呢,拉姆代表是目前来看啊,还是比较重要的,也是呢,我们这个GT8呢,非常成功的一个新特性。OK啊行,那具体怎么去写呢,咱就不看这了,哎先呢,让大家呢,直观的感受一下是吧?诶它到底怎么去用这呢,我放了一个叫拉姆达的一个test,咱们看一看啊。哎,先举例子。比如说大家你看我这里边儿呢,提供了一个接口。
08:00
哎,这个接口的话呢,我们这儿呢,提供了一个叫匿名实现类的一个对象。哎,是不是这样写的。这个大家先来汇报。哎,如果有同学说这个我还不会。那完了,这是拉姆达表示就更不会了。啊,因为呢,我们需要基于这个结构呢,我们去改造了啊。哎,这儿呢,我们造完这个对象之后呢,我调了一下run方法,所以这儿呢,不是一个新线程的开启啊,咱们只是调个run就直接执行它了是吧。OK啊,好,这个结构的话呢,如果我们要使用拉姆的表达式来写的话呢,是这样写的,注意看啊,左边这块声明的。还是一个re啊,那这块我们就叫R了。然后右边这块的话呢,诶,我们里边呢,要重启的是run方法,换句话说呢,就是凡是确定的东西呢,我都可以删掉。你这块new的是不是还是他删掉。哎,这个也删掉这个接口呢,有个特点,它就只有一个抽象方法。所以你要重写的是哪个方法也是确定的。括号什么?括号说也能闪是吧,但是万一呢,里边要用这个括号里边东西是有可能的啊,所以这个括号呢,就不要删了,诶所以呢,我们这块呢,右边写的时候呢,我就先整一个括号。
09:09
然后括号这边的话呢,诶整了一个叫这叫箭头操作符,或者说呢,叫拉姆达操作符,然后再后边呢,主要我们重解决方法就是写方法体嘛,所以你就把这个方法体呢,我们CTRLC一下,直接呢诶粘过来,然后呢这块诶一收。就完事了。啊,这样就行了,然后呢,这块你拿这个R2点,我们第一个run方法,这不也没问题吗。比如这个,我爱这个。啊,这个比如说上海东方明珠啊。啊,这样是吧,好站长你看就可以了,然后现在调离转呢,我说执行的就是这个语句。来,走起。看这不就可以了吗?哎,那么下边这个呢,咱们就是写的叫拉姆达表达式啊。好,这个呢有点感觉了,然后我们接着再看下边这个。所以呢,我们现在是叫comparor,这叫比较细了,另外一个comparor呢,它的具体一个实现类的对象了,那里边我们放的叫inte,然后这integer integer,然后呢,这块in调了一个叫compare方法,把O1O2呢放进去,返回一个啊in型的值,哎。
10:14
就这么着了,把这块我们调了一个方法,把这个12呢跟21放进去啊,1:1啊,它呢减这个显然呢是一个负的嘛,所以这时候这个结果呢,这就是个负数。啊,哎,这没问题了,好,那我们使用拉姆达表达式,看怎么写啊。左边这块呢,还是塔。诶CTRLC诶粘过来是吧,诶这个咱们就要COME2了,然后右边这块呢,确定的东西呢,咱们就删了,确定呢,确定的确定的,比如说这个确定这个,因为这已经写了。哎,这里边儿呢,也只有一个抽象方法,哎,所以这块确定确定确定。哎,这块的话呢,因为我里边要用了,所以这块我们得留着它是吧,哎,留着它呢,按说呢,是不是就该这个了。哎,这样粘过来。啊,粘过来之后呢,我们右边这块呢,诶都有一个叫箭头操作符的,然后在箭头操作符的右边呢,就是我们的这个,诶方法体。
11:04
你看粘过来之后呢,一个分号那就可以了。啊,这样就行啊,然后这里边儿呢,其实我们还可以再去这个这个什么操作一下啊,因为呢,你看这个这不是随着你这个确定它也确定了嘛,所以我们这个其实你也可以删掉。啊,这个也可以删掉。啊,这样。是吧,然后呢,这个大框能不能删呢。哎,大括号的要删的话呢,诶注意哈,删掉删掉删掉之后呢,其实把我们这个return呢也给它删了。哎,认识就放到一行呗,就这一下就行。这个呢,就叫做拉姆达表达式。啊,是不是一定有点超出你的这个认知了是吧。啊,那如果说这个呢,你觉得呢,还能接受的话呢,那下边这个方法引用的话呢,估计你就不行了。哎,咱们这块呢,造完之后呢,咱也调用一下啊,通过这个看二呢,咱们去调一下这个调compare方法,最后就诶随便写一个数。啊,这个呢,不跟我们上面这个思路其实一样,咱们主要看的是造这个对象的这个过程哈,后边雕的事呢,其实跟原来的思路是一样的。
12:06
哎,这个没问题啊,这块因为前面这大后边的小,所以它得到的是一个正数。转一下。你看你看这是个正数啊,这没问题行呃,咱们主要呢,说的拉表示呢,说的是这块啊,后边这块呢,其实。不是重点啊好,那么基于这个拉姆的表示呢,我们说呢,还可以进一步的去做一个。优化啊,比如说这块我们针对这道问题呢,说呢还可以改成叫方法引用哈,左边的话呢,还是它这口写成COM3了,诶右边这块呢。我就直接来了啊,哎,这里边呢,我们把这俩参数呢,放在这里边了啊,你这个要写的这个方法的这个参数呢,跟我这个方法参数呢是一样的,哎,我这方法呢是个静态的了,所以我就直接的。啊,In teacher冒号冒号compare。往那一放,完事儿。写完了。啊说这是啥呀,这是吧,这叫方法引用啊,然后呢,下边这个呢,不就是调用的事吗。
13:02
这个呢,叫三。哎,这个我们叫compare,散,这叫散。哎,跟前面这个呢一样啊,哎,跑起来对应呢,结果的话呢,还是一个正数是吧。完全没有问题。啊,完全懵了是吧。好,这呢,我们叫诶主主要你看有这个符号哈,它就叫做拉姆达表达式。哎,如果呢,要是这样的啊,冒号冒号这种就是叫,哎可能是方法引用,就是我们后边就讲的哈,可能是构造器引用,也可能是数独引用,哎就是这块的内容。这个呢,咱们先放一放,咱们先把这个拉姆的表达式呢,先搞定是吧。好,回到这块呢,我们看一看啊,说这个拉姆达表达式的一个使用举例,哎,比如说咱们刚才这呢,就是一个典型的一个使用场景。啊,CTRLC一下我呢就把它粘过来了。啊,以它为例来说啊,诶这个格式举例话呢,这个首先,呃,咱们这里边呢,首先说一下这个事儿哈,它呢叫做。他那叫拉姆达操作符,或者叫箭头操作符。
14:03
哎,拉姆达哎叫操作符或者呢叫做箭头,哎操作符啊,这个呢是比较好理解的啊,就是这样个结构,哎,然后的话呢,我们左边这块呢。啊,对应的有个结构是吧,哎把这个呢称为什么呢。啊,这个呢,它的左边是吧。这个我们称为呢,叫拉姆达行参列表。诶,这个叫拉姆达形态列表,就是一个名啊,哎,那么这个形态列表,你根据咱们刚才呢,用这个之前的这个结构你做个对比。哎,你说我们这个形单列表,它对应的是谁呀。哎,你发现这个O1O2不就是我们这里边这个结构嘛,是吧,哎,其实这块呢,你要是不写的这么彻底的话呢,你也可以呢,原封不动的把这两个呢给拿过来,这也是对的啊。诶,只不过呢,我们进一步的优化呢,还可以把它俩去了,说白了我们这个拉姆达形态列表呢,它对应的就是我们,诶这里边儿这个抽象方法在重写的时候呢,对应的这个形态列表嘛。
15:04
哎,这不就我们这个要重启这个方法的形态列表吗?哎,这说一下啊,拉姆达形态列表它呢就对应着。啊要啊,重写的接口中的抽象方法的形参列表。哎,这个呢,注意一下。哎,对应着过白,或者说白了他就是。啊好,那这个呢,是我们的左边了,然后接着的话呢,我们它的这个右边哈。这个右边呢,我们是这样写的啊,那你回到我们刚才这个程度来看哈,哎,这个右边的话呢,实际上直接是不是就是我们这个。重写的这个方法的方法体啊。啊,你看上边这个可能更清楚一点哈,我们直接呢,就把这个结构是不是就直接呢,就搬到这儿了,诶我们这个呢,其实也可以搬过来啊,只不过呢,我们刚才搬过来之后呢,又对它呢,做了进一步的一个优化而已啊诶比较直接的描述呢,就是它呢,首先我们称为它叫拉姆达提。
16:03
诶,它呢就叫做拉曼拉起它呢叫对应着。啊,我们说那叫接口的实现类啊,要重写的。方法的方法体。哎,这就可以了。好,那如果大家你把这个事儿呢,整清楚了,那基本上我们这个拉姆表示呢,大家其实呢,就掌握了一大块儿了。是吧,但是具体写的时候呢,注意我们在平时开发当中,既然呢,我们是替换这个结构的,你肯定不会上来呢,先写这个了。你说我先写把,把它先写出来,我再改成这样,那当然了,这个难度就降低了,你想你要上来就这样写,还是有点懵的是吧。哎,注意是这样一个特点啊。好,嗯,这个嗯,拉姆达表达式的一个使用举例,嗯格式的一个举例,这个呢,我们,诶我把这个格式的一个说明写到这儿也行啊。啊,写到这儿的话呢,上面这个呢,就是我们叫拉姆达。叫行灿列表。
17:00
哎,然后这块呢,一个箭头操作符,然后右边呢叫哎拉姆达提,这个拉姆达你会写啊。那就是这样的一个结构呗,那下边呢,针对它的一个具体的说明好。这样我们就先让大家呢直观的感受了一下,那么具体该怎么写呢?像我们刚才说的说这块你还可以再进一步的优化,那这块到底怎么去优化呀,咱们就回到这个代码这块了,咱们下边要讲一讲啊,具体该怎么去写这个拉姆达表式了。啊,这里边儿呢,我其实都已经提前写好了一些这个代码了,来降低一下大家学习这个拉姆表示的一个难度啊。好,我们就按照这个顺序呢,一个一个去说,一共呢是有六个格式,这六个呢,讲完之后呢,大家关于这个拉姆达这个格式呢,就清楚了。好,首先呢,我们来看第一个啊,还是咱们刚才写的这个程序。说的这呢是一个reable,二一你有一个reable,这是匿名实现类的对象。然后呢,通过这个对象呢,我们去调里边这个run方法啊,这个比较清楚啊行这呢对应的我们这个方法呢,是一个无参的无返回值的。哎,这样一个场景这块呢,你就原封不动的啊。
18:02
哎,把它粘过来,这我们叫二二。右边这块呢,按照我们刚才说的啊,哎,首先呢,叫拉姆达形态列表,就是对应的我们这个方法的一个形态列表,然后呢,来一个叫哎箭头操作符。然后右边呢,就是我们这个方法的这个方法体,把这个大括号呢粘过来,诶完事了。哎,这样来看呢,还是挺简单的是吧,这个R2点我们来个run。哎,这个呢,就是我们说的叫拉姆达表达式啊。这个过了啊,我就不运行了,然后下边这个。说这个拉姆达呢,它需要一个参数,但是没有返回值啊,你比如我们这个啊,说呢这呢是一个叫consumer啊,这个你不用关注太多,这就是一个接口。这个接口的话呢,它也有一个抽样方法啊好,然后呢,我们提供这个接口的匿名实现类的对象了啊,这里边儿这个方法呢,叫做accept传入来是一个字串,把它呢给打印了。这个事儿的话呢,哎,我们这块来调一下啊。声明的话呢,还是他。
19:00
这个我叫抗议。哎,右边这块是不是基本上大家也知道这个套路了,是不是就把这个呢,CTRLC拿过来是吧,然后呢,来一个箭头操作符。哎,是不是就把这个呢,整个呢,CTRLC一下往这一粘啊,一封是不是就可以了。哎,就这样来写,跟咱们刚才那一的套路一样啊,然后这块呢,你再拿这个坑一点,我们去调这个赛方法,这样你就可以传个字符串,这个呢就是食参传递的就是我们这个行参里边你不是打印了吗。但是稍微注意就是你看这个结构的话呢,似乎你看不出来这个方法了是吧。因为这个方法呢是确定的,所以我就给。也去了。你同学怎么叫确定呢?注意,这里边其实有个特点。这个接口是吧,它里边呢,是不是只有一个出方法呀。对,你要有俩的话呢,是不是我就整不清楚你到底去的是哪一个了,是吧?诶所以这个呢,有个特点啊,这个拉姆达表达式呢,适用的话呢,诶就是针对于我们这个接口中只有一个抽氧方法的场景啊。好,那这呢,所以我把这个offset就给省了,在这你看不出来,但实际上里边呢,就是offset掉的呢,就是你这个大括号里边这个结构输出啊,说谎言和誓言的区别是什么。
20:08
啊,区别啥呢?啊,一个呢,是说的人当真了是吧。啊,一个呢,是听的人当真的是吧。哎,当真了。OK是吧,行这个呢就完事了,当然重点不是这儿是吧。哎,重点是我们现在调它的话呢,会打印哈,来走起。哎,这不就出来了。哎,这个呢,稍微体会一下啊好,那么基于这个呢,我们再往下走。哎,这呢,其实还是咱们刚才这个consumer,然后我们还是叫这个赛方法来写了一句话,然后现在的话呢,我们呃,基于刚才嗯,你看这个呢,写的其实就我们刚才这个写法呗。哎,我把它那拿回来了,又重新的迭代的啊,迭代的时候呢,说数据类型啊,可以省略。啊,因为呢,可以由编译器推断呢得出,哎称为呢叫类型推断,哎,你就比如说我们把这个结构,咱们先整个完整的拿过来吧。
21:01
这个我叫康二。然后这个位置的话呢,我说S的前面这个是string类型。这个类型的话呢,你看前面这块呢,由于你认识string了,这是string,这就是string了,所以这个类型呢,我们是可以推断出来的,你就可以不写了。哎,就这样是吧,诶把这个类型呢,我们就删掉了。啊,那这块说大学可以重来,你最想干什么?想干啥呢?嗯。大一就来上威武,这有点假是吧?大一还是有专业课要学是吧,嗯。这个其实想想疫情这几年呢,对于呃,这个先后毕业的这几届学生来讲,其实还是挺。没什么美好的回忆是吧,诶大学呢,这个四年里边可能三年呢,都线上了啊。哎,没办法是吧,以后呢,不行再读个研是吧?哎,你最想干什么呢?嗯,谈一场。啊,轰轰烈烈的。嗯。
22:00
嗯,爱情是吧,然后大四的时候再分是吧。好,这个呢,写完了,来,走起来。诶这呢就出来了啊好注意呢,我们从二到三的时候呢,是把这个嗯,这个拉姆达形态列表里边这个类型呢给去掉了,我们把它称为呢叫类型推断啊,这个类型推断呢,咱们是不是前面也讲过一些场景是吧。回忆一下啊。N对数组的时候,比如我们这呢,是因字形的啊数组啊,你有一个因特形的数组,然后这个位置呢,那我们写个1234是吧,诶前面这块呢,是不是就可以给它去掉了。哎,这就叫做类型推断。嗯,还有吗?换行是吧,对啊,比如我们这块写一个叫哎哈希map,这呢是string类型的key啊,Inte类型的value啊,这的是一个,哎,我们就new一个呢,叫哈希map,这个在JDK机之期之后呢,我们说这块就可以省略掉了。那这呢,也是一个类型的推断啊。
23:00
OK啊,其实呢,我们在后边呢,讲到JDK10的时候呢,咱们再一下咱们这个map时候呢,其实也提到过一个,比如这个map点咱们去叫ENT。是吧,原来要写的话,你看我这是alt加个回车。是不就成这样了?哎,那我们在GTK10的时候呢,有个新特性。挖一下就行是吧,哎,这呢也是一个类型的推断啊。这个呢,是在。嗯,JDK10。啊及之后可以用。诶,咱们现在用的是JDK17啊,所以这个新特型呢,就一直保留了啊,是可以使用的啊啊这呢都叫类型推断,所以这块呢也是可以啊把这个s string的类型呢给它省略掉的,没问题。好,接下来再说啊。哎,这呢,就咱们刚才还是写的这个consumer了。哎,咱不是把这个类型给去了吗。说呢,这个时候如果你的行参列表啊,只有一个参数。这是我们说这个小块呢,也可以省略。啊,那就意味着我们把它呢,CTRLCL一下粘过来,这个我们叫二的时候呢,这个小括号呢,就不要了。
24:04
哎,就这样。这个我们是叫抗二是吧,哎,这样呗。诶,所以呢,我们刚才这个讲解呢,主要的都集中在这个,呃,拉姆达形态列表这块了。嗯,好,这个形态列表这块呢,我们已经说完了。想想啊,这块的话呢,我们怎么讲的呢。呃,正常来讲的话呢,它对应的就是我们说呢,你对应的这个方法的这个形态列表了。哎,回到我们最初的位置啊,就是这个位置,或者说呢,是我们刚才写的是不是这个位置是吧。然后呢,如果你要是只有一个参数的时候呢,直接写这个变量就行,小括号就省了,类型是一定能省。呃,你要有一个参数,比如,哎不是,如果你要没有参数,像这样这还能省吗。这就不能省了,这省了就相当于少东西了,是吧,所以你就要是没有参数,或者说呢,你要有两个参数。哎,都就别省了,只有一个参数的时候呢,才能省这个小括号啊。哎,把它给省掉。
25:00
刚才省掉呢。在下边是吧,哎,这块我们就可以省掉了,好这个呢,是我们说的这个左边这块啊,说完了,然后接着我们来看这个右边了。说这个拉姆达呢,需要两个或两个以上的参数,多条执行语句,并且呢,可以有返回值的这个场景。啊,这里边你看我这样写的啊comp。啊,因为这。然后这个方法里边,你看有俩参数。这样的场景是吧,这块我们怎么写呢。哎,先在我们这块呢,给它到这儿是吧,CTRLC诶粘过来这个我们叫哎,Com,然后右边呢。诶按正常来讲呢,是不是应该就写这个了是吧。那该这么着了啊,但是这么着呢,我们说了你这个类型呢,不是说可以省吗。你要有俩参数了,小括号呢就不要省了。然后接着呢,这个箭头操作符,哎,右边呢,就是你对应的右边的这个叫方法体,在我们这呢,叫拉姆达体,诶这样一诶写就可以了。嗯,大家现在感觉可能写的时候呢,多少有点堵的成分,就是放这儿呢,反正不报错就行啊,报错就不行是吧。
26:03
啊,其实呢,不是这样的是吧,你找到这个规律呢就行了啊好,这个完了以后呢,下边啊,这就是个调用的事儿了啊。诶CTRLC拉过来,这个咱们叫诶COM2嘛,你这样调一下就完了啊,这个调用呢,其实是小事啊。行,那这个呢,我们就是对应的把这个就输出了一下啊,主要呢,就是我们给他提供这个实现类的对象的时候,用的拉姆达表达式啊好接着往下。说呢,当这个拉姆达旗只有一条语句的时候。哎,只有一条语句啊,那这里边呢,可能还有瑞return,那这时候我们说这个return呢,还有我们这个大块呢,诶都可以给省略掉。啊好这呢,我们把它呢先呃,其实呢,这不已经是有这个结构了嘛,是吧,CTRLC粘过来,诶左边这块呢,已经是没啥可动的了,然后呢,箭头操作符右边。啊,这一段大括号呢,因为你只有一行执行语句嘛。所以大括号就可以省了。哎,大块要省了,大家可能会想,那我就直接写它了是吧。
27:01
但是这时候你注意它还是报错的。也就是说你要是呢,不省这个大块,那你就写上。写上这么着是吧,哎,你要是省这个大块呢,你把大块省了之后呢,这个蕊寸呢,也一定要删掉。哎,那如果说我们这句话没有return呢,没有return那你就不用了,没有return嘛,那你还删啥return呢是吧?哎,就可以了。这个呢,就是我们说的这个写法啊,那右边这块呢,其实已经是比较简洁了啊啊,这我们再去调一下。这个我们是COM2是吧,哎,那它就调一下就行啊,像这个比如换成16。哎,跑一下。啊,没问题啊,行这儿呢,我们就诶把刚才呢,我们提到的这个拉姆达里边的几个语法规则呢,咱们就走了一遍啊,那么回过来,诶,大家呢,通过我们刚才这样一个讲解呢,看有没有一些感觉哈。哎,下边呢,我们先来抛一下叫拉姆达表达式的一个本质,你看是什么?哎,本质回到我们刚才写的这个代码这个层面哈。
28:03
你看一下,咱们就以它为例吧。诶,咱们左边这块呢,实际上是生明这个变量是吧。而且这面料比较特别。都是接口是吧。而且这个接口呢,还有一个特别之处。对,刚才咱们举的这么多例子呢,你发现这个接口里边呢,都只有一个抽象方法是吧。哎,你重写这一个呢就可以了,那么我们拉曼表示呢,针对的也是这样的场景。哎,针对这样场景,好,哎,那么接着再看哈,哎,我们呢,这儿呢,声明的是一个变量,你右边的话呢,其实的话呢,我们是不是需要呢,写一个对象啊。那你看现在我们这个对象是不是就拿这个拉姆表示充当的呀?虽然它长得呢,可能有点怪哈,但是你从整个格式上来讲,这个我们左边生命的变量了,右边呢,是不是就是个对象啊。所以说拉姆达表达式,它充当了咱们这个接口的实现类的对象吧。或者说呢,这个拉姆代表是就作为我们接口实现类的一个对象出现了。
29:03
再减省一点,那么表示是对象。对,那不是把定语给省了嘛,是吧,哎,所以回过来你看拉姆达表示这个本质是什么呢?这个呢,我说一下啊,这个一方面。哎,咱们说呢,这个拉姆达表达式。哎,它呢,作为咱们这个接口的实现类的。是不是对象啊。哎,那就说白了,拉曼表示,不就是一个对象吗?只是说长得有点怪。哎,这个我们从另外一个角度来说,大家你看哈,咱们这个拉姆的表达式,我是从哪儿抽出来的呢。它对应的是不是那个方法的型材。这个呢是对应的方法的方法体。哎,唯独呢,这个方法是不是没有名啊?因为你只有一个出方法,所以这个名呢是确定的,所以我就删掉了是吧。哎,那我们是不是可以把这个呢起个名,我叫什么呀。叫匿名函数。
30:00
你看它本身就是一个,哎,当然你也可以叫方法是吧,哎,这其实就是一个方法的行参方法的方法体吗?你没有名。因为名确定了,所以我们就可以叫做匿名函数是吧?所以这块来看的话呢,我们也可以把这个啊,拉姆达表达式呢,说呢,它就是一个匿名函数啊。哎,另一方面。哎,拉姆达表达式。哎,表达式啊,它呢是一个匿名的,哎,咱叫函数了,相当于咱们Java里边呢,咱们叫方法,像这个C语言呀,哎,这个javascript呀,哎,包括其他的一些语言啊,其实我们很多时候都叫函数了啊。哎,就类似于我们扎的方法了,好,你把这两个合在一起。你看能得出一个什么样的结论呢?相当于是不是匿名函数是一个对象了。啊,在咱们Java里边呢,咱们其实提到过叫万事万物皆对象是吧,那现在呢,你一个匿名函数是不是也是个对象。哎,或者你换句话说,你说拉姆达表达式呢,是一个对象,这个呢,你也可以作为咱们的一个是不是素材啊。
31:03
哎,体现呢,不就叫哎万事万物。来接对象嘛。啊,这样个情况啊,而且的话呢,哎,在咱们Java里边呢,这个呢,一说呢,就涉及到这个历史了啊Java呢,我们最初呢,就说是一个纯粹的面向对象的语言。啊,我们做各种操作呢,咱们都得体验维持对象了,其实呢,就是万事万物皆对象了。但其实呢,在诶很多这个场景下呢,我们用对象去操作啊,其实挺重的。啊,有点重,你想想咱们当初呢,写这个hello word的时候,一上来造个类,整个may方法是吧,里边呢去写这个代码,那你要完成一个功能的话呢,也是先造类,造对象调方法,所以显得就比较重,而像有一些语言呢,它这种函数的方式的调用呢,就比较轻巧一些。啊,所以呢,你可以从这个角度来看Java呢,就开始通过这个拉姆达表示呢,就学习其他的这样一些编程语言的一些优点了,啊回到咱们这个课件这块呢,诶我这儿呢,也有一些这个相关的一个说明啊。
32:03
哎,这个往后我们走一走。嗯,这个呢,提到这儿了是吧。啊,在这来看哈。嗯,说这个首先这个拉曼表示呢,不是咱们Java呢最先引入的啊,最早的话呢,像其他的一些语言呢,早都支持拉表示了啊,相当于Java这块呢,就借鉴了一下。把他呢就拿过来了啊,然后呢,诶障碍呢,我们说传统的是面向对象的思想,说做一个事儿呢,我们总是呢,想找一个能解决这个事物的一个对象,解决这个事儿的一个对象,然后调二这个对象方法完成这个事物,而这种函数式就我们这个拉姆表示为代表,不就是这个函数吗?他这种思想呢,说我只要呢能够获取结果就行,谁去做,我不管怎么做也不重要,重要的就是这个结果。啊,那这呢,相当于呢,我们在Java,哎,在面向对象这块呢,我们一定程度上补进来了一个这种函数式的思想,那就是以这个拉姆达表达式为代表的,诶这样的一个结构了。啊,这个大家稍微的体会体会啊,找找这种感觉啊,你看这个结构呢,明显我们写出来呢,确实还是比较简洁的。
33:04
啊,他呢,注意是一个对象。虽然说长的呢有点特别啊,这是一个函数,函数呢是一个对象。还是没有逃出这个面向对象这样一个手掌是吧。啊,还是一个对象啊,注意。好,那这呢,我们就提到这儿了,然后接下来哎,咱们也发现了哈,我们在提供这个时间类的对象时候呢,发现这个接口啊有个特点,它呢就只有一个闯方法。哎,我们拉姆达表达式也正是针对于这种场景呢,来使用的拉姆达表达式,所以这块我们就提出来说这个为什么需要函数接口,什么是函数接口,诶我们就这块儿呢,说明一下啊,首先什么叫函数接口呢?啊,非常简单啊说呢,如果接口中。只有或叫只声明有。值。哎,声明有一个抽象方法。哎,则此接口就称为叫函数式接口。
34:01
啊,非常的简单啊,那么我们为什么需要函数接口呢?呃,因为呢,只有这个函数式接口提供时间类的对象的时候,我们才可以使用拉姆达表达式。啊,这边说一下啊,因为。啊,只有给函数式接口提供实现类的对象时,我们才。哎,可以。哎,使用这个叫拉姆达表达式。所以这块呢,大家也可能看到说,诶这块呢用的挺好,其实这块呢,我都提前都设计好了这些接口啊,它都是这种函数式接口。啊,有这样个特征啊,你像我们这个叫competitor是吧,这个我们点开一下,你看你会发现呢,这个哥们呢,在上面呢,加了一个注解是吧。这个重点呢叫functional interface,这就叫做函数式接口。然后这个注解呢,你点进来看一下,它是不是在1.8的时候引入的。哎,因为1.8的时候呢,我们才有这样一个概念,哎相当于在1.8的时候呢,就给我们这个接口呢,加了这样的一个声明,哎杨IG呢,就它里边呢,就只有一个闯方法。
35:07
OK啊回过来,哎,咱们前面也遇到了一个叫reable,哎,然后呢,我们把它呢也点开看一下。诶,它上面是不是也加了一个呀。哎,这呢,就相当于是做一个显示的校验哈,那不会说因为我们这个没加它就不是一个函数接口了。就跟咱们说override一样是吧,你不加这个override呢,它该重写还是重写,只不过呢,去检验一下而已啊好,那要这样的话呢,咱们自己写一个啊,我在这样的一个包下呢,我去,哎,声明一个啊,是个接口啊,比如我就叫做MY。哎,Function哦。Functional interface。啊,My functional interface,好,完事了是吧,在这里边的话呢,我就写一个除方法,假设我就叫做method。哎,就这么着,我这儿呢,其实就是一个。函数式接口吧。哎,就是只不过呢,这块你要愿意加上这样一个声明呢,你就加上不加呢也没关系,但是你要加上之后呢,你要再去加一个重号方法,这个事呢就不对了。
36:06
他就给你报错了,说你不是一个函数接口。啊,这个大家注意一下啊好,那这个我定义完之后呢,说白了我们就可以呢使用拉,表示给这个接口呢,提供时间类的对象了啊,比如我们就相当于做一个叫MY,诶functional。哎,这个特。我咋写个这么长的呢,是吧,哎,这人来一个单元词方法。哎,这么着啊好,你看这块怎么用呢,哎,我呢就声明为叫MY啊functional啊interface,这就这声明了,然后来一个比如M右边。所以咱们直接就写浪漫表示了哈,所以要想大家能够直接写出来,你脑海当中需要呢。浮现出来,他的抽象方法长什么样?就是你脑海当中应该要把它的这个结构呢给映射出来。啊,然后的话,你这块写的时候呢,你才游刃有余是吧?啊,你脑海当中浮现出来这个method方法呢,行参呢是个空的啊就这么着了是吧,然后里边呢,要干什么呢,就是你要做的事儿,你说我就写个输出语句。
37:06
哎,我就写一个system。点儿。Banana辣。比如就写一个哈。哎,就这么着呗,这个写完之后的话呢,我们就可以去调啊M点二。这一调不就指引这句话吗?哎,这不就可以了吗?行,这个呢,就咱们自定义了一个啊,大家稍微的体会一下就行了,好那么我们再回来啊。说既然呢,我们知道这个函数接口了,哎,说这个API里边,诶,我们是不是在GT8当中给我们声明了好多的函数接口啊,哎,实际情况呢,也确实如此。啊,这个呢,我们打开这个API文档。嗯,走起啊,嗯,这块呢,首先我们进来啊,叫贝斯。然后呢,往下找Java点优秀点function。有点方,诶在这呢。哎,这呢有个包,这个呢叫function,它里边呢,都是给我们提供的这种函数式接口。啊,遥言之呢,就是大家呢,哎,后期如果需要一些函数接口呢,直接呢,可以在这里边去调就行了,这里边儿呢很多你看是吧。
38:07
啊,很多啊,所以这块我们回过来哈,用在API当中,函数结构所在包,哎我们说呢,哎声明在哎java.au点,哎叫function是这样的一个包下。啊,注意这个呢,是我们GT8当中生命的是吧。哎,声明的。啊,函数式。嗯,接口是吧,都在是吧,我们这样一个保险。OK啊,这就说到这儿了啊,哎,然后的话呢,这里边咱们稍微的。啊,稍微的,嗯,说点啥呢,说常见的函数接口都有什么。哎,常见的函数接口刚才不是看到说有这么多是吧,这个咱们要都去熟悉的话呢,显然是有点太多了,哎,平时呢,我们在开发当中啊,诶有几个比较基础的啊,咱们需要熟悉一下哪几个呢?回到我们这个课件这个层面。哎,这叫四大,哎核心函数式接口,实际上我们刚才呢,也用过这个consumer了啊。
39:04
还有其他的这样一些。诶稍微看看啊,这几个人看都在泛型啊,这个consumer呢,这个叫消费型的。啊,其实你可以形象点去理解,消费型呢,就是意味着我们能往里边放东西,它里边这个消费完了,消费完之后呢,也不返回。啊,而且呢,就是你给我东西我就接收啊叫accept。行,这是它哈,哎,这个大家稍微有个印象,然后supplier呢,叫供给型的。供给型的就是他不接受东西,但是它返回东西。啊,没有参数啊,返回值呢,是一个泛型方程呢,这不就个函数吗。安出来,就是你能放进去东西,然后返回的这个东西,这叫自变量,这叫因变量吗?也只有这样的场景啊,然后呢,这个呢叫predic。啊,叫判断型的一个接口。哎,怎么着呢?哎,你把这个T呢,作为参数传递进去,我判断一下你这个T呢,哎,返回的是个处还是个false。啊,这个呢,我们在开发当中呢,比较长的是这几个。
40:00
注意这几个是比较基础的啊,哎,基于我们像这个consumer呢,这个叫消费型的,它又衍生出来有好多。啊,然后供给型的又衍生出来好多,你看还挺多的是吧。哎,这块呢,几个基础的这几个来我们稍微的啊,哎,我这块把它写一写,大家呢也有个印象,首先呢,我们叫消费型。接口叫啥来着?看情味。消费者嘛,这上是一个T是吧。好,它里边这个方法叫什么来着。Accept啊消费型,所以你给我东西呢,我就消费了,所以它呢是一个没有返回值的是吧。啊,这个呢,是我们对应的方法啊,这个我们这样写上啊,这是一个叫接口。哎,后边啊,这个叫哎对应的这个,哎抽象方法。嗯,好,这个消费型,然后下一个呢。供给型接口。哎,这个呢,叫supplier是吧。诶,这不supplier啊,它里边呢也写了个T,诶他呢就是不要东西。
41:04
它可以出东西是吧,它这个叫get啊,不放东西呢,能返回东西。这样的啊,它那叫函数式接口。或者叫函数型的一个接口function呗。这个呢,有俩是吧。啊,一个T一个二了,然后呢,这个体现呢,就是前者呢属于自变量啊,后边呢属于叫因变量了,它这个方法呢,叫做apply啊。然后你放进一个T进去,我给你返回一个二类型的一个值是吧。哎,这样的哈,好还有一个呢。哎,这个叫判断型或者叫断定型都可以啊。判断型啊接口这个呢叫prodic。啊,这个大家呢,是不是学完编程之后,这个英语水平呢猛增啊。啊,这个有点都不熟了是吧,Predict呢,就是判断断定的意思啊好,这个位置呢,我们也传一个T进去,它呢就是做一个判断叫test,你把这个T呢,这个T呢。
42:02
诶给他写进去,然后他给你返回说你这个号谱不出法false啊,那就这个意思。好,这块呢,我们就诶熟悉一下这个事儿啊,后边呢,我们相关的一些练习当中啊,都会出现这样的一些函数式接口,包括呢,我们后边还要讲这个string upi啊,里边呢也会用到它们。那这个大家呢,先提前知道有这几个事儿就行啊,然后呢,基于刚才我们说的啊,这样几个基本的,他呢,还有一些拓展型的是吧。嗯,像这种呢,我们说叫BI consumer BI呢,你可以理解成叫bary。Fe就是二的意思是吧,所以这个你看T跟U,它就相当于是不是有两个参数了。哎,可以呢,消费两个东西啊,还是个Y。啊,这个double的叫consumer,就意味着它这个参数呢,就是double类型的了。啊,这个我就不过多去说了,包括像这种函数的话呢,它呢也会有这种。啊,像这种场景呢,或者这种场景的这个里边呢,它就相当于是,嗯,这个长得可能有点不像函数了啊,它就只有一个,哎,它呢,传进去的是T,返回的还是T是吧。行,这个呢,我们就不多去说这个事儿了啊,后边呢,我们遇到相关的一些函数接口呢,咱们再用就行。
43:05
那么回过来啊,咱们呢。再从整体上来看一看这个拉姆的表达式呢,咱们要想用实际上就是给这种函数式接口呢,来提供实现类的对象的。啊,然后呢,我们右边提供对象的时候呢,写拉姆表示,刚才呢,我们举了这样的一些这个使用的例子了。好,那么这个例子呢,咱们做一个总结哈。这个总结的话呢,其实主要针对的就是因为你这个箭头操作符这没啥了,主要呢,就考虑它的这个左边是吧。哎,这个左边呢,也就我们说的叫拉姆达形态列表。诶,那这块呢,大家在写的时候,你想想我们总结一个经验是什么呢。首先呢,咱们说它对应的都是你这个抽象方法的那个形态列表了,是吧。哎,那个形态列表呢,首先我们说的这个类型都可以省略是吧。啊,这个我们说一下啊,拉姆的形态列表,然后呢,这个参数的类型。
44:02
哎。类型都可以省略。整来例行了。啊,这块还有一个特别的就是,如果你这个参数呢,只有一个。哎,那么这个小括号呢,也可以省略是吧。哎,如果。哎,行参只有。哎,一个,哎则一对。哎,咱们这个一对呢,这个小括号呢,说哎也可以省略。也OK,也就这样了啊,你要是没有这个参数,或者你这个参数呢,是两个G以上,注意那就不能省了啊,只有一个的时候呢才能省,左边呢,就这样了,看右边啊。这个右边的话呢,咱们对应的呢,叫拉姆达体是吧。哎,这拉姆拉体,拉拉体的话呢,我们说对应的就是咱们这个重写的这个方法的方法体了。那这个方法体这块我们怎么描述呢。
45:01
啊,这个呢,其实特别重呢,也就是说你里边只有一行执行语句的时候是吧,哎,这我们这样说啊,他呢就诶对应着咱们呢,诶叫重写的这个方法的方法体是吧,那如果呢,这个方法体中只有一行执行语句。啊说呢,则一对大括号呢,是不是可以省略了。哎,可以,哎这个省略啊,那这块还得补一句哈,兄弟,如果呢,你要是有嘴的话是吧。哎,如果有return这个关键字。哎,则必须一并。省略是吧。诶OK,这呢,就我们说的这个只有一行的时候呢,一个特点,那你要不是一行了,那你只能打框呢,就留着了。就有点像我们if else里边你只有一行这一句,哎,大块也能省多行了,那你必须得留着了。这呢,我们就把这个规则呢就说清楚了,那么关于拉姆表示呢,其实核心的点也就这个,主要的大家的难点在哪呢。
46:01
就是你自己写的时候呢,你是不是脑海当中浮现不出来这个东西啊。诶,你要能复现这个东西呢,其实写起来是比较快的。啊,这不有个词儿呢,叫什么胸有成竹是吧?啊,你要是这个呃,脑海当中有这个方法的话呢,其实写起来还是比较快的,没有没有。那你大不了你就看着这个API,然后看一眼之后呢,回来再写,但是你写多了以后呢,你就记住了。啊,这样就行啊。
我来说两句