00:00
嗯,怎么来写我们呢,先写一个,呃,普通的方法啊,就是看一下我们用optional以前咱们大概怎么去做这个事儿,现在呢,我想返回一下叫get,谁呀,叫girl,她的一个name,获取这个女孩的一个名字,我们传进来的呢,是一个boy。哎,获取这个女孩的名字啊,那我们可以比较直接的直接报1.get一下go.get一下name。这就拿到了,但是很显然这样的一个写法呢,是会出现控制人的吧。来,下边我们做这个测试。感谢一个赞。好在这里边啊,在这里边的话呢,我们怎么着呢,去调这个方法来CTRLCCTRLV,哎,我们呢,需要传一个boy上面呢,我们去造一个说boy boy等于new一个boy。诶,我这样造的。
01:00
然后把我们这个包呢放进去。返回的是一个四锥形的勾的name。行,那首先看这个会控制人吗?会吗?哎,这个位置呢不空,但是你调完这个勾以后,这呢没有负这个勾这个值,哎这呢是不是就是个闹了,哎,然后你再调这个name呢,这不就控制人异常了。哎,这不就控制异常了啊,哎,这是我们平时写代码的时候,可能会出现这样的情况,包括呢,我们这个boy本身啊,你可能它本身就是个闹。报这块要是闹,直接在这块就爆了。啊,这也是这样问题,那所以说呢,我们这块演示的都是以前写这个程序的时候呢,诶这样写确实容易出现控制的这个问题啊,那这时候我们这个方法呢,就需要呢,去做一个优化啊,需要做一个优化。
02:00
嗯,这呢,相当于是我们去啊优化哎以后的就要get勾内方法,哎这个方法啊,那这个方法的话呢,我们避免这个哎重复了我们这写个一啊,那在我们讲这个optional之前,哎,我们要避免这个问题呢,那就需要大家呢自己去判断了。对,你比如说这个boy先得保证它不等于闹,哎不等于闹呢,你再通过这个boy呢,点get一下这个go,哎,接着拿到我们这个go,哎,Go呢也别着急去调,哎,Go呢也得判断不等于now,哎,那么这样的话呢,你再哎return一下哎,go.get一个name,哎,如果这块呢,只要有不是if进去的啊,你就return一个,比如说now。呃,原来就得这样一层一层往里套,这呢,咱们有两层,这个引用类型变量就得写两层一了,那要再多的话呢,是不是就得层层往里递进了。
03:00
对,这个写起来还是比较痛苦的啊行,那这个写完以后呢,我们再拿上边这个句测CTRLC。哎,这就来一个这个四了啊,哎,咱们调的是这个一的方法,此时的话呢,因为你有这样的if的判断了啊,不管是这个也好,这个也好,是不是就没有控制人了。对,没有控制人异常了啊,但是呢,就是一个闹呗,哎,就这样的情况啊,行这呢是我们没有这个optional的时候呢,我们得这样的去考虑这个问题了,那下边的话呢,我们来看一下,哎,咱们用这个optional的话呢,怎么去实现啊。CTRLC。哎,这个咱们是使用。哎,使用optional这个类,哎的这个get name啊这块咱们改成是个二吧。那这样避开跟那个方法重名啊,这个呢,传进来的是一个boy啊,这个咱们暂时呢,先return一个闹啊,不让他抛异常了,传进来是一个boy,这个boy的话呢,它可能本身就是一个no,是有这种可能性的,那咱们呢,哎,首先给它包装成一个optional的话呢,咱们得用是不是刚才说的这个方法了。
04:11
啊,因为本身这个位置是不是可能是nor是吧,你就不能用这个O了。哎,就用这个啊行,我们就用一下它CTRLC。拿过来,那这个位置CTRLC一下CTRL一下,那这样的话呢,我们首先把我们这个boy呢,给它包装到一个optional里边,哎,我就叫boy optional吧。那这个boy optional?里边到底这个boy是不是闹都有可能。是这意思对吧,这都有可能,都有可能,那怎么办呢?你要是不是闹的话呢,我们就可以去get它这个勾,你要是闹的话呢,就不要盖了。不就是这样一个逻辑吗?那现在我们CTRLC一下,这怎么判断呢?哎,我们在这个optional里边呢,诶看到还有一个方法,这个方法呢,叫做all else。哎,All else,嗯,就是如果说我们当前optional里边呢,有这个数据,那就用你这个数据,如果你这个数据是no的话呢,我们还有一个备胎,就是这个行三的other。
05:17
哎,就是他,哎就是这个他,哎那咱们这个为了大家便于理解呢,你可以在上边我们做一个简单的测试哈,你看我们这个go,这呢,我制成的就是个nor,这是个no言,我们此时这个optional里边,你这个go不就是个nor吗?我们接下来,哎这个咱们先这样跑一下啊,刚才其实也已经看到了。啊,这个下边我这这个代码有点问题啊,先把这块呢注释一下啊。行,这呢就是这个empty,刚才咱们其实已经演示过了,然后在这个位置呢,我这optional go,哎,我去调一下这个叫all else,哎all else里边我们去new一个勾啊,为了让你看的更清楚,我们给这个勾呢,也可以附上个值啊,比如说现在这个啊女明星当中。
06:08
比较火的现在谁?赵,赵丽颖还行是吧,这样,哎先传个赵丽颖吧,啊哎这样呢,你看我们就填了个他啊,他的意思就是说,诶,如果你当前这个容器里边,哎这个对象呢,如果要不空啊,不空呢,就拿你这个返回这个咱们还得all else以后呢,咱们得接收一下啊,接收为就是一个勾。哎,然后我们把它呢,CTRLC一下放到这儿了。或者我们先这么着,我把这个复制一份啊。放在上面。哎,这样啊,那此时呢,就是如果呢,你当前上边这块呢,传进来这个勾呢,要是非空,那我们这里边呢,拿到的其实就是你,但是你要是这个空的话呢,我们就拿到的是它了,哎,它呢相当于是一个备胎啊执行。
07:02
你看你看我们这种呢,输出的就是赵丽颖。哎,之所以拿到它,就是因为我们上面这块呢,这不支撑的是nor,你要把这个no呢注释掉,这呢就真是有这个对象了。哎,有这个对象,这个我们novel得到它就有东西,有东西呢,他就不会用这个all else了,哎,所以你看得到的就是这个数据了。哎,这样啊,所以这块呢,也是咱们要用到的一个方法,叫做all else,这里边呢,常有一个T类型的一个T说,哎,如果当前的啊,我们这个optional。哎,中的这个或者叫内部啊,封装的这个T啊是非空的,哎则返回,哎则返回我们这个内部的这个T说如果。哎,如果我们这个内部的这个T啊,它是空的啊,则啊,返回我们这个all else方法中的啊参数。
08:06
哎,参数我这个叫T吧。哎T哎,这是我们这样一个意思,那通过这样一个说明呢,我们就能很好解决个问题啊,就是我反映这个go,我一定可以让你保证这个构呢是一个非空的。嗯,你要是不空,我们就用你,你要空的话呢,我就用它,那肯定呢,它这块就不空。哎,这样的话呢,我们就能规避这样一个控制帧的一个问题了,啊行,你看我们回过来呢,咱们这块做一个测试了,这个呢,我们放进去的是个boy,这个boy呢,说我们先ONOB包装一下,得到了它了,然后接下来,哎,然后通过它呢,哎,咱们是不是得调一下all else了,哎,因为它不保险嘛,不保险这块我们得去new一个,哎new个boy new个boy的话呢,这个哎咱们这块呢,整整的这个层数有点多了啊哎,整了两层这个自定义的这个类型了,那这块我们再去扭一个勾吧。
09:02
哎,你个够,这边我们再写一个明星,迪丽热巴是不是也还可以是吧?啊,当红这个明星啊,诶,All else,然后这块呢,我们out enter一下,诶,我就得到了这个我是个boy啊,哎,是个boy行,拿到这个boy了,这个boy的话呢,我说呀,我就一定可以去get go,这绝对不会出现空帧。对吧,因为不是你这个本身的,你的非空的值是不是就是我们这个new boy了,对的啊,好,我们out enter一下,哎,我们得到一个go,那得到这个go以后呢,这个go呢,我们也不能特别着急的去get name,因为它呢,可能是不是还是一个now啊,他要还是个闹的话,又得包装一下呗。咱这写的呢,稍微复杂了一点啊,我这呢涨了两层,正常咱们一般要开发中用的话呢,顶多也就一层了,就直接拿这个数据去用了。
10:07
啊,咱这又包了一层,那此时呢,你得再把我们这个,哎这个不能用O了啊,哎,O novel,哎把这个勾呢扔进去,哎,我们al一下,哎再得到一个新的optional,我们叫要go optional,这个go optional,诶CTRLC它呢,哎我们试图呢去拿到它的数据,但是呢,有可能你拿到这个勾呢,它里边又没有具体的值,对我们又得all else值呢去扭一个勾。哎,再扭个够,这个再放一个谁啊古力娜扎,诶行行放进去了,然后呢,Al enter,这个时候呢,我们得到就是一个具体的勾了,哎,这个叫勾一了,哎这个时候我们说这个勾一一定是非公道了啊,直接呢,你去改一下内它就一定没有问题了啊这呢就我们这个情况啊,我们在这呢稍微写一下,哎,此时的这个哎BOY1啊,一定非空,哎,我们这里边这个勾一一定非空。
11:18
成这呢,就我们这个操作这个方法写完以后,我们简单做一个测试啊,哎测试五行那这块我们想去调的就是这个方法啊,这样粘过来里边呢,需要传一个boy,传1BOY的话呢,我们上边去造一个啊boy boy等于我这呢就写个no,哎,我把这个boy呢扔进去。哎,这个呢,我们接收为一个值。Name。大家判断一下,看我们这个G内的输出的是多少啊。看你这块呢,清楚不清楚,这时候呢,我是一个闹,我就把这个闹闹放进去了。
12:03
这个闹。这块诶是不是就返回迪丽热巴了,这就出来了啊行,那这个呢是它,然后呢,我们换一个哈,我这个boy,诶等于我new一个boy这样写的。这个没有这边负。啊,这就意味着什么呢?我们到这儿的时候呢,没有没有选这个,就是咱们自己这个boy,但是你去get勾的时候,这是不空了。哎,这空的话呢,呃,这块我们就传了一个古力娜扎,哎,这不就古力娜扎就出来了。啊,咱们这个写的层数比较多啊,正常呢,大家要开发中用,顶多也就建到一层了,就报案里边呢,有一个变量直接拿到这块就就直接返回了啊,我这儿呢就多写了一层,所以看着呢就稍微绕一点啊,然后再接着呢是一个正常的情况,哎,Boy呢,我直接扭一个boy啊,还可以再扭一个勾。
13:06
啊,再来一个谁呀。嗯,这个苍老师知道是谁吗?不认识是吧?嗯,教课的啊,你看这块就出来了是吧?啊诶这块你看我们这个呢,就是算希望我们正常的一种情况啊,就是这个呢,有对象这个里边诶也是废空的返回它,但是呢,我们可能会出现这里边特殊的情况啊,那此时呢,我们能保证就是它一定不会返回一个空值。啊行,那这样的话呢,咱们就把这个optional这类的话呢,给大家就说了一下啊,那总结一下这个optional这个类的话呢,就是尽可能的避免我们在开发中出现控制帧异常啊,而出现的啊,就关于这个optional这个类啊,啊为了在程序中呃,避免出现啊控制帧异常。
14:05
哎,这个而创建的,哎那么常用的这个方法,哎这个方法,哎我们刚才看到了啊,第一个叫o no。哎,大家用这个方法里边呢,你可以传一个T。哎,这是它啊,这是第一个方法,哎另外呢,就是如果呢,你这里边这个是空的呢,我们可以拿另外一个else呢去补一下,哎,就是这样两个方法,诶大家关注一下就可以了啊这呢是我们自己主动去用这个optional,另外一种情况呢,就是咱们讲到刚才这个string API的时候呢,你会看到我们这呢,诶它返回值类型就是一个optional啊,返回值类型是一个optional,然后这块的话呢,我们这个直接打印相当于是个optional的,那如果说我这块就想看到你这个具体的money。是吧,我就想看看这money怎么办呢?哎,怎么办,你再再看的话呢,就得找这个API了,哎相当于我就想把里边这个数据拿出来,咱们刚才这不是拿的是这个操作嘛,哎你看他有个方法叫做get,但是大家调get的时候呢,一定要小心,哎这里写了说你调get的时候呢,得保证啊,你这里边这个咱们这存在是double,这个double呢一定不是no啊,你这个double要是no的话呢,我这块get就会给你get出来一个异常。
15:24
你看我们这个get,哎,这呢,就是我们里边封装的这个Y6,说你这个Y6如果要是闹,我就给你抛这个异常了,说你这边没有Y6是吧,Y6V值啊,你要是不是空的,你就调这个Y6就行,这呢是对于这个非常确定的情况啊,也就是说呢,我们这个钙的操作,它其实跟我们上边说的这个恶五呢,它俩有点像这种对应关系,就是大家非常确定里边是有数据的,你就用这一对,那如果不确定的话呢,我们说那你就用这个和我们这个呢去搭配。咱们要是避免控制帧的话呢,大家可以去用这一对,那如果你要明确知道他这个数据啊,就是飞空的了,嗯,不妨呢,你也可以在这块直接get一下啊,拿到的就是一个纯粹的一个double型的值。
16:12
哎,这就纯粹的个数了,前提是你得知道他飞空啊,如果你要是呃,又不想让他看到,哎,不想让他报这个控制帧,其实还有一个方法,这个呢叫is present。先判断一下里边是不是空,哎,不空了,你再调get哎就行了啊,这块我就不演示了啊成那这样的话呢,我们把这个optional这类呢,我们就结束了啊,那整个呢,关于扎二八的这个新特性,哎,我们这一章呢,就算是结束,哎简单的总结一下啊,哎,关于我们这一章整个来看的话呢,其实他们应该算是个整体,这呢是一部分,这呢是一部分,它呢就是一个普通的类啊,其实很多情况下呢,我们可能都想不到去用这个类,那么更多的时候呢,就会发现在其他的一些API当中,人家用了,诶你知道这个optional是什么意思就可以了,要求其实不是特别高啊,然后这个STEMAPI的话呢,确实通过刚才我们的演示能够感受到这个强大模。
17:12
啊,就是API比较多是吧,哎,就里边呢,我们针对于集合呀,数组啊,可以做各种各样你想做的一些操作啊这呢去401PI里边去找,哎这个呢,大家把我讲的这些呢,你有时间呢,可以稍微的写一写,练一练就行啊然后上边这块呢,我们要求呢也说过了,哎,最起码大家能够基本看得懂拉姆达表达式,这个你会了以后呢,你再考虑下边这个方法引用和构造启形的事。啊就行,整个来讲的话呢,这块呃,大家呢,你放一放再去研究也没有问题啊,它不像我们前面讲的反射呀,IO啊,集合呀,多线程啊,你要不会的话呢,后边有一块知识就缺失了,这个呢就是一些新的语法啊,而且的话呢,在公司当中,呃,大家呢,可能多数情况下呢,都还没有应用的起来啊,多数情况还没有应用起来啊,那这个能不能用,你当然还得看公司的这个JDK是不是八和以上的这个版本才行啊。
我来说两句