00:00
那下边呢,我们就具体来看一下这些新特性啊,那我这呢,就没有按照我们这个新特性的一个序号这个顺序呢来讲解了,而是按照我们这个呃常用的一个情况啊,首先来说语法层面的一个变化,这里提到叫Switch表达式,那首先这块呢,关于Switch结构大家并不陌生,那一上来呢,这块呢,呃,举了一下叫Switch的一个弊端啊,弊端只能这么说啊,在我们没有讲新特性的时候呢,我们感受不到说Switch就有哪些弊端,因为我们有弊端了,你也没有什么办法,就得这样用是吧?那有了这个新特性以后呢,我们这块就可以归纳出来说他有什么弊端了啊这个事呢,感觉挺挺逗的啊啊有点像我们最初学障碍的时候呢,用的是数组啊,当中用的时候呢,你觉得也挺好啊,那么后边呢,我们接触到集合以后呢,你发现啊,原来数组呢不好用啊,提了数组各种各样的弊端。啊,又又像是这个生活当中啊,比如说你用一个旧的手机,手机呢,其实用的也挺好的,但突然出现一个新的版本啊,这时候你有有各种理由去说这个旧的手机的不好是吧?或者说呢,诶,交了个女朋友,刚开始的呢,觉得挺好的,那么又有别的女生撩你了啊,这时候你发现啊,原来你有这那不好啊,其实是挺不好的是吧?呃,但是这块呢,我们因为有了新的表达式的,所以这块呢还是要提一下,哎,我们要解决原有的S维结构的哪些不太好的方面啊,应该这样去说,这呢罗列出来了这样几项,呃,咱们通过一个Switch,呃语句呃,咱们去体会一下啊,这个呢,因为比较简单,大家都会了,所以我这块呢,直接就把相应的这个代码呢粘过来。
01:31
啊,这个我就整体上粘一下了。嗯,到这啊,CTRLC,诶我们这块呢,就已经把这个idea这个环境呢已经搭起来了,大家也去创建相应的一个工程就可以了,在这个功能下呢,我分成两个module了,一个modu了,来测试咱们JAVA12的新特性啊,一个来测试这个13的啊呃,整体上的话呢,我这个product是13的啊,也就是说我们创建这个工程的时候,先看一眼我们整个这个结构,这个project这块呢,我选的是一个13的这个版本,呃,因为咱们已经安装了GDK13,诶大家如果这块没有的话,你选个I啊,选中你,呃当初的这个。
02:07
JDK的一个相应的这个目录结构啊,你给大家导进来JDK的这个版本就可以了,呃,然后。嗯,回到这个product啊,然后呢,下边你默认的使用的这呢,呃,就是我们13的,或者你可以指定的是某一个啊,这都OK,诶这块咱们用默认的就行,诶接下来的话呢,我们去创建一个module,诶这个modu呢,诶我们就这块先默认的就是13,然后next起个名字啊不妨我就JAVA12的一个测试了,诶这样来写啊finish。好,这就出来了,那针对我们这个modu的话呢,大家可以去设置一下啊,比如说我们这个modu呢,我们现在诶关于它的这个12的啊,嗯,我想选择呢,是这个12新特性的一个情况,那你这块就可以找到我们这个12,在12这块呢,其实大家也能看到哈,这个idea的话呢,在这里边显示出来我们每一个版本的主要的新特性的一些说明,那对于我们12来讲呢,这块提到就是Switch表达式。
03:01
啊,你可以把咱们当前那个Mo呢,指定就是12不让他用13新特性,或者呢,其实你就用13的也OK,因为12的新特性呢,基本上也都做了一个保留啊,在13的环境下呢,也是可以执行的啊,选一个OK。好了,然后呢,Src下呢,我们去新建一个包package啊,这个我们叫com点啊at,诶硅谷点Java行,那在下边我们去创建一个,哎,刚才提到了一个Switch的一个测试,OK。好创建好了,哎,把刚才呢,我们这个代码呢,给它粘过来。哎,这我把这个就删掉了啊。行,那这个程序呢,大家应该都不陌生,简单说明一下,这呢,我定义了一个局部变量叫number of letters,然后呢,这呢提供了一个枚举类叫fruit,对应的这个对象有pear啊,应该是是吧,梨,苹果,葡萄啊,芒果啊,这个orange啊,Prepare这个呢是这叫什么木瓜是吧?这个男生一般很少吃木瓜哈,女生据说这个这个这种水果有一些特殊作用哈,好,这呢是我们说的这几种,这个fruit乳水果。
04:08
然后呢,我们知道这个Switch当中呢,是可以放这个枚举类对象的,所以我们把这个服务的这变量呢,就放到这儿了,然后根据它具体是哪一个枚举类对象,我们匹配相应的这个case语句,做一个相关的执行啊,这里边呢,涉及到给我们这个局部变量做一个赋值的情况,Defa的话呢,还抛了一个异常行,这个呢并不陌生,我们跑一下啊,做一个执行。哎,咱们这块呢是Apple,所以呢这个执行的结果啊,那这块提到这个问题了啊,说呢咱们现在用的是12啊,一起使用的就无效了,仅支持13那个版本的预览功能啊,那咱们这块呢,做一个调整吧,在这啊,我们把这个当前的project调整12。嗯,调成12啊,然后这个呢,也是12。嗯,看一下这个module。12,哎,OK啊行,然后OK一下,哎,再来做一个执行。
05:03
好,那这块呢,输出的是五,因为呢,咱们这个Apple,哎是这儿吗?哎,所以这个正常输出的就是五了。好,这是我们说的这个情况啊呃,然后的话呢,我们这个针对刚才这个情况,我们解释一下它的这个弊端啊,第一个说匹配呢,是从上而下执行的,如果忘一写break呢,后边的K语音呢,不论呢,是不是匹配都会执行,这个事呢,相当于每一个开发者我觉得都会出现过啊这个刚开始写这个Switch的时候呢,这个break呢,确实经常忘,那首先一个点就是break呢,当你忘了的时候呢,它不会去提示你说你这个语法错误了,因为我们在某些情况下呢,这个语句当中不一定非得要加break。啊,是这样的情况啊,那如果我们确实忘了加break了,就像我们现在这个情况,他通过这个Apple的方式呢进来。那进来以后的话呢,这个它会没有补break情况下接着往下执行啊,进样的话呢,就会执行到我们这个default了啊defat抛了个异常了,所以这块我们写一个输入语句呢,这个也一定会执行不了,诶我们先注释掉啊跑一下结果。
06:05
那你看确实处理异常了,就是这呢是一个关于break情况,因为我们开发时候呢,经常忘了写break啊,他就会自动的往下去匹配下面的这个case了,这是其一,其二的话呢,说所有的case语句呢,共用一个块范围不同的case语句定义的这个变量呢,是不能够重复的啊,这个想说明的是这个问题啊,诶我们再把它复原一下。好就回来了啊啊,比如说呢,我们在这个呃离这块啊,我们定一个number的变量啊,我就呃任意的给大家指定一个值,比如说是十。啊,那这个指定完十以后,按说这个变量呢,它的作用域只在我们这个case结构当中,但是呢,我们在这个比如说mango它的下面,我们同样的再去指定一个number,哎,我叫20发现呢是不允许的,那因为他认为你这两个number呢是重名了,就是相当于我们在不同的case结构当中,呃,这个虽然它的作用率呢,只是只适用这个P了,是吧,但是它不让我们在这个里边,下边这个结构中再定义同名的变量,那你要做的话呢,只能是像我们现在这个number of letters一样啊,给大家统一的定义在外面啊,这样才行,这呢是我们说的它的,呃,第二个小的问题。
07:15
那这点呢,在有时候开发时候呢,确实有一些不方便啊,然后第三个呢,说不能在一个case里写多个执行结果一致的条件啊,比如说咱们现在涉及到这个Apple grape和mango这三个呢,呃,他们执行的都是这样的一条语句,那能不能这样写呢?啊,就比如说我们写成一个叫kiss啊,这个我就叫Apple,然后逗号。啊,Grape啊,逗号啊,比如叫mango,哎,这样的写法呢,是错误的。哎,我们再把这个变量呢,CTRLV给他拿过来,这是不允许的哈,就是我们这三个case结构呢,他们执行语句是一样的,能不能这样写呢?不行,只能是按照咱们传统的一个写法啊,就这样写啊,这种写法呢,咱们也有一个名字啊。
08:01
啊,叫做case穿透。啊就相当于我们只能是分别呢写出各个case结构啊,冒号呢这个指向,其实这呢谈不上新的语法啊,是因为呢,我们执行这个case结构的时候呢,它没有break了,所以自动的就执行到下一个语句啊,然后下个也没有break,又执行到下一个啊出现了break了结束的啊这叫case穿透啊是这样个情况,呃,不能这样用啊,这呢是对于以前来讲啊,这是错误的。好,这呢是我们说的这样的一个点,然后下个呢,说整个Switch呢,是不能够作为一个表达式返回值的啊,那很显然,当然这里边呢,呃,如果你有相应的一些返回结果,这个是不允许的,所以呢,我这里使用的叫number of letters,如果呢,你想有一些值,根据不同的情况呢,做赋值不能返回了,那你只能是在内部呢,对这个变量进行一个赋值来这样的一个操作,这呢就是我们所谓的这个弊端,好这呢就说清楚这个事了啊,那B端说清楚以后呢,我们下边来提一下这个新的特性叫Switch表达式。
09:06
这22呢,我们说对Switch语句呢,进行了扩展,诶,称为叫增强版的Switch语句,或者也称作叫Switch表达式,为什么叫表达式呢?因为我们可以返回一个值了啊,所以是表达式这样的一个特点了,首先的话呢,我们会看到在SW这块我们加了一个叫preview啊,就叫预览模式,什么叫预览呢?先做一个介绍。说此位置表达式呢,它是作为预览语言功能的第一个,这个语言改动被引入到新版的Java中来的,啊,那这个预览呢,本质上来讲,这是引入新特性的测试版的一种方法。啊,比较极端的情况下呢,就是说呃,用户呢,在测试以后,如果发现呢,这个预览的这个特性呢,不好,呃,没有被很好的接纳,完全可以在后续的版本当中给他干掉,他也不会出现在我们Java SE的规范当中。啊,注意这是规范啊,那在我们这个JDK当中呢,你肯定是有的啊,因为我们这块呢,已经马上要演示这样的一个实现了,在规范当中不会出现。
10:04
好,这呢就是我们所谓的叫预览,后续的话呢,其实也有很多新的特性啊,都是一个预览的,包括我们JAVA13的啊都有啊好,那这是我们说的这个事,然后下边的话呢,我们来引入一下JAVA12当中提到的这个Switch的一个新的语法上的特性,这呢是对它进行一个描述啊,我就不过多的说这个事了,咱们直接通过代码的方式来说明,呃,在这里边我们再去新建一个类。诶,这个Switch test这个我叫一个一了啊。我们来演示一下这个JAVA12的新特性。嗯,行,嗯,那这里的话呢,我写成一个单元测试方法吧。哎,四维啊一啊这样。好,那这个呢,我们使用的是UNIT4,哎,给大家做一个导入啊,行,这就可以了,嗯,那我们现在要用的话呢,还是用这个枚举类啊,还是用这个枚举类,然后前面这些操作呢,我们大体上先保持一致啊,比如说我们上来也是先诶提供一个诶枚举类的一个对象,然后下边呢,我们写一个叫Switch,把我们这个诶fruit密类对象的变量啊给它放进去,然后接下来是一对大括号。
11:22
哎,在这里边我们写的一个case啊,这个case的时候呢,后续,呃,你看我这里边写写的啊,Case接下来我们可以指定啊,我们跟这块基本上也保持一致啊。先是一个离。啊离是吧,哎离后边的话呢,我们使用的是一个叫箭头操作符,哎到后边我们可以去输出相应的这个结果,比如说我输出的这个就是四。诶,这这样情况,然后再接着kiss,嗯,还有其他的这个水果是吧,苹果。哎,注意逗号。看下边呢,是叫葡萄。芒果。
12:01
诶诶,这个中间有个逗号啊,下边的话还是箭头操作符,哎,我们输出的结果,比如说是五点啊s out一下。好,再接着K。嗯,这是我们说的后续的这叫orange和嗯,Prepare是吧,木瓜。哎,这个呢,我们输出比如说叫六。哎,这样情况,那如果呢,你是一个default啊,Default的话呢,我们还可以给他家去抛一个相关的异常,跟我们刚才的异常,比如是一样的啊,Illegal state啊CTRLC过来。好,这个呢,我们就写完了,那写完以后呢,我们下边做一个执行啊,选中啊,或者直接我们在这块点击啊执行。我们这呢是Apple,诶我们看这个结果能不能出来这个。啊,Apple在这呢啊,诶五就可以了,诶大家呢,你看这能发现两点啊,第一个就是我们这块呢,没有再去写啊,相当于我们如果匹配到Apple以后呢,在没有情况下呢,它也不会去匹配下边的这个case,就解决了我们一开始提到的这个问题。
13:11
啊,关于break这个问题啊,那再者呢,我们这里边如果呢是多个啊选项啊,它的这个执行语句呢,是一样的,我们是可以用逗号这样方式呢,进行一个连接的啊,相当于解决了我们说这个问题是吧?好,然后下边还提到像关于这个表达式不能用的问题啊这呢,我们就可以再去讲一个变种了,首先呢,这个大家清楚啊,然后在这个基础上呢,我们可以更进一步。啊,确实这个新特性呢,还是比较方便的。And switch2。啊,在这里边,嗯,在这里边我们把刚才这个结构呢,先CTRLC啊整体的拿过来啊,然后的话呢,我们跟刚才这个。呃,之前的这个结构一样啊,我们去定一个变量,这个变量呢,我们也生明在咱们的这个局部变量的位置啊,然后呢,哎,现在呢,我可以让咱们的Switch整个这结构呢,充当一个表达式。
14:05
啊,表达式,表达式呢,运算完以后呢,可能会有个结果,那我们可以这样去操作啊,CTRLC,那我在这个位置。哎,给我们这个。那随时进行一个赋值啊,只不过这个位置我们就不能这样写了,哎,如果你是一个P的话呢,我们就让它对应的输出的是四。呃,注意我们这块写的是一个int哈,那我这块呢,就得是一个不带双引号的,比如说四了,诶这个呢,就是无。六。嗯,然后这个呢,抛相应的一个异常啊,这样我们来一个分号。哎,这样的情况啊,那此时的话呢,因为你抛异常了,这个这样了啊,我们加一个肉是吧。好,呃,那么在最后的时候呢,我们再去打印一下咱们所谓的这个number of letters这个变量。哎,这样就可以了,那这个程序呢,我们跑一下。哎,行啊,这时候呢,出现的一个结果呢,是五。
15:02
嗯,相当于呢,就是我们此时这个Switch结构呢,充当了一个表达式的作用,这个表达式呢,运行完以后呢,它会有个结果,这个结果呢,就赋给了我们number of卡,呃,Number of letters这样这个变量了,那如果说我们这个付的这个里边,比如我这写的是Apple啊,诶这个Apple呢,没有指定,那就会走到这个default里边。哎,此时的话呢,我们相当于会抛出一个异常。哎,这个是没有问题的,行,这呢就是我们想给大家演示的一个,呃,新的特性,这个呢,是我们在张22当中出现的一个语法层面的一个变化。好,那我们回过来再来看一下我们这个小的一个总结啊,我这个课件当中又给大家罗列了另外一个例子啊,这个例子呢,跟我们刚才讲解的是类似的,大家下来呢,也可以做一个演示。好,总结一下这个我们看到的这个语法结构,我们称作叫增强的Switch语句,或者呢叫做Switch表达式啊,作为安卓的同学呢,不陌生,因为在calling当中呢,跟我们这个问的表达式呢,其实是比较类似的啊,其实也能看到我们Java语言其实就融合了各家的一些特长啊,比如我们JAVA8当中啊提到这个拉姆达表达式。
16:10
啊,这个也是扎巴的一个主要特性,这个拉姆表示呢,其实来自于呃这个啊斯SKY拉语言或者Python语言啊,他们比较早的引入了这个匿名函数的概念,呃,包括呢,像我们JAVA8中这个接口里,咱们可以定义默认方法或者是静态方法啊,这个呢,其实也参照了我们skyla这个语言当中的叫特质啊这样的一个结构啊,因为skyla这个语言的一个开发者呢,其实它也是我们Java这个语言vac的这个编译器的一个呃开发者了,所以呢,诶,他把skyla当中一些新特性呢,其实也引入到我们这个Java当中呢,呃,其实正因为这样呢,所以咱们Java语言才更具有这个这个叫什么活力啊。嗯,这个呢,呃,提到了一些相关的好处,这个咱们就不过多介绍了啊,提高了代码的质量,开发的效率,确实呢,看着更方便了啊,这个特性呢,虽然作为一个预览版,但是我们能看到呢,这个特性在后期的一个长期支持版本当中,应该会保留在这个Java时代当中,一会我们讲,呃对Switch表达式呢,又进行了一个升级。
17:11
好,这是这个,然后呢,一个展望JAVA11和之前的版本,我们看到呢,Switch是支持下边的一些结构的,这个不用多说,大家都比较清楚啊,像最近呢,是在JAVA7当中引入了这个string啊,表达式就是我们Switch后边这个结构里边可以写string了,那么在未来的Java某一个版本当中,它也会去支持float double和long啊,以及对应的包装类啊,这个我们就做一个期待就可以了,好,这呢是我们提到叫诶Switch表达式这样的一个新特性,哎,大家呢,下来可以演示一下。
我来说两句