00:00
接下来呢,看一个叫做凹什的胃,对吧,我们张方另外一个特性是什么呢?说张达他提出了一点,他说他要尽量的避免空子人异常吧,我们说原来我们说身为程序员,这个空子人异常没有人没见过的,对吧,那个空子异常经常会见得到莫名其妙的,就是可能在我们做项目运行,程序运行的过程中,某个地方是不是就得到了控制啊,对吧?然后原来我个同学的什么debug,然后一步一步追踪,说这个空值到底是在哪儿发生的,对不对,对吧?所以说控制的异常呢,我们通常遇到,并且遇到了非常烦躁,对吧?因此在综合发中呢,它提出了一个叫做optional类,它的作用就是尽量的避免控制针异常,对吧?所以这个类呢,在这个U下,它是一个容器类,代表一个值存在或者不存在,说原来用now表示一个值不存在,现在option可以代表更,它可以有。
01:00
更好的表达这个的概念,对吧,然后并且可以避免控制在一层对吧,那它实际上是不是就是类啊,容器类里边封装一个对象,然后是不是提供这么多个常用方法呀,对吧?过来呢,咱们把这些常用方法先试一试,然后再看看它的一个应用。那么这个呢,就叫做test,叫做optional对吧?容器类说optional呢,它一有一提供了一些常用的方法,过来咱们试一试对吧,说optional容器类的常用方法有这么多个,咱们过来试一试,首先呢,第一个对吧,对吧,Ctrl shift of等于钩是这有个of方法,它是不是创建一个O的实例啊,对吧,那就创建一个实例,先叫做O的点of,那创建实例,创建实例你是不是得封装对象呢?我说O它是容器专门用于封装对象的,那我封装一个谁呢?不是用一个employee,是不是封装一个employee的项啊,那么这个时候的括号括号,那么这个时候呢,他就可以给我得到一个optional类,对吧。
02:19
平,同时它带半形的对吧,然后比如说叫做op对吧,那么拿到这个op以后呢,我就可以对吧,比如说我们是不是就可以get一下啊,通常它有个get的方法,可以获取option容器中的这个值,那我们可以get一下叫做op.get是不会employee啊,或者我给它拆开来一起了,说这样的话有个get返回一个employee对吧,然后emp对吧,然后把这个emp呢接收之后反应输出,注意我这个没存任何参数吧,那输出的是不是都是默认值啊,都输出的对象的默认值,右键运行。
03:03
是不是有啊,对吧,那这就是optional,首先通过option方法可以创建一个实例,但是呢,这里呢,它有个注意事项是什么呢?这个of方法呀,它不能传一个什么值,现在我是不是构造一个new employ啊,我们实际应用当中,可能这个employ是从别的地方传过来的吧,那别的地方传过来它说有可能为闹,那么这个时候怎么办呢?那我们先试试看看闹行不行,这时大家注意看啊,右键运行,我去构造了一个no对吧,那我运行一下一式。是是不控制针了,对吧,发现它也放了控制针了,说明明说你不是用于解决控制针异啥了呢?那你传过来一个no,这是不是还是发现控制针呢?对吧,但是他提出这个思想是什么意思呢?对对,现在这个孔子针异常是不是发生在这一句啊,对吧,他是不是相对来说就比较明显了,含义是它提出的这个思想,就是它如果通过now构建一个O的话,它是不是直接就在这里发生了控制的异常啊,对吧,也就意味着通过这一点来看,我们就能以最快的速度锁定控制针异常所发生的一个位置吧,就直接在构造O线轴的时候就已经发生了,对吧?像原来如果说我们发生一个控制针异常,那它是不不知道在哪发生的呀,然后我们就得debug对吧,最踪看哪发生的控指针异常,这不知道从哪来的对吧,而现在我们就可以通过这个快速锁定控指针异常这个位置直接在这知道啊传过。
04:39
来的这个东西是个闹。对吧,对吧,就能快速解决这个问题,那这是一种解决方式,对吧,就是应用的其中第一种。那么假如说有的时候啊,我们说我们是不是就想构建一个no啊,对吧,有的时候为止我就想构建一个no给这个O,那怎么办呢?那这个时候呢,它有一个noble对吧,No这个他说如T不为no,是不是创建obal实力啊,否则创建空实力吧,对吧,说什么是空实力,注意看这里是不是还有个empty啊对吧,你可以用op叫做op t al点叫做empty对吧,然后构建一个all personal的来个employee,看看这个东西是什么,叫做op,等于它对吧,达到它以后我S op.get这个时候右键运行。
05:37
注意,这次发生在哪呢?是发生在这啊,它只是没有值了,对吧,那这个option我是不是构建了一个空的optional。对吧,这个option包里头是不是没有任何的东西啊,就是一个空的optional,然后呢,如果你是空,通过空的optional去get的话,那是不是就get不到值啊,对吧?那这是构可以构建一个允许构建一个空的optional,那么另外一个novel,对吧?我们说那有的时候我们就就想干嘛呢,我就想构建一个空的optional,除了这个empty以外,还有一种方式叫做optional,点上novel,呃,点of novel,对吧,然后来个new,一个employee的对象,看看行不行,叫做open personal点上呃,这个键括号带泛型employee,来一个op,然后拿到它以后呢,这一次我先get一下op.get看看能不能获取这个阴lo右键。
06:40
运形有没有,这个是有的,但是呢,与此同时它也允许你构建一个no,但是呢,注意看我又建我是我构建一个空no,与此同时我又去get获取它里边分到那个值吧,那这里边是没值啊,对吧,那这个值右键运行是不是也告诉我了呀,这个no sa element是不是没有这个值啊,他说也快速的能够锁定问题所在啊,而不是发生控制异常吧,它就直接告诉你OB点盖的时候没有值了。
07:12
是不是这意思啊,我们是不是就能快速的锁定这个空发生的位置了。对吧,对吧,那注意啊,这几个是不是有点不一样啊,首先of它是不能构建闹的吧,对吧?Empty是只是构建一个空的option吧,对吧?那相应的novel是不是你传过来一个no,它就会构建一个空的option啊,你传过来一个对象,它就构建一个对象啊对吧?实际上no呢,是它俩的综合吧,说如果Y流等于no,是不是调用empty啊,否则调用of吧。对吧,是它俩综合呀,对吧,那这个就是了啊,那假如说这里边有没有值,我们怎么办呢?对吧,有的时候我就就就是要这么用,那万一呢,他要是没有值,我就不想获取了,对吧,那这个时候呢,它又提供的方法叫做is percent,它可以判断是不是包含值吧,对吧,说if对吧,如果说op e.is percent说里边要是有值,那我就get一个没值我就什么都不做。
08:20
这可以了,那这个时候右键运行是是不是绿的呀,什么都不做对吧?那这回呢,我再来个有值的叫employee,然后呢,再右键运运行是不是有值就获取啊,没值就什么都不做了,对吧?那这叫is percent,实际上它还有个核心方法叫什么呢?叫做all else对吧?All else说如果调用对象包含值,那就返回那个值,否则是反问T,给你来个替代值对吧?这个就跟咱们原来学三数理记里头那个有点像,叫做if到if道函数大家还记得不了对吧?说如果为空,是不是给它搞个代替的值啊对吧?现在这个也一样,说op.op点上else,嗯,叫做o else all else对吧,说如果有值就有值,没有值呢,我就给它用employee来一个,对吧,用这个代替一下。
09:21
叫张三对吧,18对吧,然后然后还整啥来着,9880.88,然后来个三点瑞是这几个吗?对吧,然后呢,得到一个叫做呃,All else,他给我得到是employee吧,Employee emp对吧?拿到它以后呢,我就sets out emp一下,这是什么意思啊,就看我这个op里头有没有装装装值吧,对吧,说如果有值是不是就盖这个了,那这个盖子呢,暂时我就可以不用了,是不是这意思啊,说如果有值我就获取它了,没值我是不是就获取默认值,是不是看O的啊,O的封装的值就获取封装的那个值,没有值我就有个默认值代替,那就右键运行。
10:16
那这是不是有值啊,对吧,都是默认都是原来的值对吧,那现在呢,我给它构建一个no,那这样的话又建运行是不就默认值控制针异常还有吗?是不是就没了呀,对吧?那这样的话,它使用这种方式避免的控制针异常,说白了就是它给你对于空的一些判断是不是都封装到容器里了。对吧,对吧,避免我们自己再去做一些特别的判断,避免引发一些控制这一常的不造成的不必要的麻烦,除了这个all else方法以外,还有个叫做all else get吧,All else get呢,实际上跟all else差不多,只不过它的这个要求返回的参数不一样说哦2SCAR是如果电动变称po值返回单值,否则返回S获取的值S是不和lier对吧,说lier是个什么东西,这是op.o else get注意看它是不是要求pplier是供给型接口啊,它生成对象用的呗,对吧,生成对象用的对吧?那这个时候呢,我all else,但是呢,我们说来个叫做。
11:31
我呃,传过来个E对吧,然后呃,不不不,这个叫供给没有返回值是吧?没有参数是吧,来个insert哪去了,那这样的话呢,没有参数是不是直接给你返回个值啊对吧,那我们说返回个什么值呢?我们返回个new一个employee。对吧,那这个相向上边区别在哪啊,到底。
12:00
区别在于我这是不是个函数式接口,函数式接口就意味着你是不是可以写任何你想要的功能。对吧,对吧,说你有个任何的需求,比如说你什么什么条件满足下返回这个对象,不满足条件返回那个对象是不是都可以啊,对吧,这里就可以有这个功能了啊,然后呢,到时候呢,也会返回一个employee emp拿到它以后呢,再c out,然后像emp是搞定的,对吧,又接运行是不是也可以啊对吧,就是说你现在呢,在这里你就可以设函数嘛,函数接口,你就可以通过LA的表达式传一些你任何你想要的功能。看吧,对吧,行了,这是all else get,那下一个是不是还有个map和Fla map对吧,Map和Li map map和play map以前之前咱们遇到过没呀,是不是在这个stream API里头遇到过呀?说这个是什么意思啊,说map法如果有值对齐处理并返回处理后呢,Optional,否则返回empty,对吧?那么比如说option点上employee employee来个op,等于op点上of,那来个叫做new,一个employee,我用这个来吧。
13:34
CRV对吧?然后这时呢,来个op点三是外呀,它需要一个分是不是函数式接口啊,对吧?那函数式接口呢,就是我是不是传进一个参数啊,它要给我来一个就是1.getname是不是这意思啊,反格式同学啊,对吧?然后得到的是一个string吗?不是,是option optional的string对吧?S tr out s.gET所以就把那个容器里的那个对象应用到这个函数上了,就把数不应用到map这个函数上来了,把容器中的这个对象应用到map这个函数上,获取了它的名字。
14:19
看懂吧,对吧,那这叫做map,相应的还有一个叫做Fla map,叫做op.Fla map发现它也是一个function,对吧?但是它不同之在什么呢?不同之处在于这个返回值,它要求这个返回值必须是个optional的值,知道吧?而刚才map的返回值是个什么值呢?Map的返回值是一个只要是U类型的值,是不是就可以啊对吧?就是你OBU,也就是它指定的是什么了,它数就比如说是employee,那是不是就返回employee及其子类啊,这个function是不是就返回employee及其子类就可以了,对吧?但是flag map要求返回什么呢?Flag map要求必须返回option的吧,就意味着你返回那值不管返回什么,必须也得用option到这个容器里呢包装一下。
15:19
是这意思吧,对吧,就是返回的呢,也要求用option包装一下,也就传过来个E返回的,我要是返回的看看这个E1.getname说一点该name,这回还行吗?是不是不让了,对吧,说你这次必须得返回什么呢?返回1.name可以,但是你必须把它给我包装到al,点上of包装到option里吧,再返回open的使去ST2是不是看懂了C到ST2点上get,然后再去右键运行说否定对吧,说白了是不是就进一步的防止控制人异常怕你返回的这个是没有啊,也有可能没空吧,你再去盖它是不问题不行啊,那现在就就是。
16:13
返回的必须是optional,进一步避免控制人异常,那么这个呢,就是这个optional避免控制人异常的一些方式,对吧,所以就是把一个对象封装到option里,它呢给你提供了一些相应的方法,对吧,或者说如果说你要说每值,它还能给你来个替代值。这没问题吧,对吧,就像是我们平时用人家给我们写好的那个写一样,他说给你返回的那个值,比如说你调用它的函数方法,他给你返回值是不是也有可能有,有可能没有啊,那这样的值它是不是就给你用。Optional包装一下给你返回对吧,有可能有,有可能没有的,就给你返回个optional对吧,然后另呢说如果一定有的,它是不是就不用office包装了,对吧,对吧,那我说通常应用还可以应用到哪呢?咱们举这个简单的小例子,比如说呢,现在呢,我们创建一个实体类吧,随便来个实体类,比如说我们创建个men对吧,创建一个类可以吧,我们说men men是不是都有这个名字对吧?或者说什么呢?我说男人,男人心中是不是都有个女神呢?是都有吗?叫god,你怎么什么情况gods就是女神,是这么拼的吧,只有DB ness吗?只有D,没有D多个D是吧,叫做godde对吧,God这。
17:51
啊,就比如说男人心中都有个女神,那当然我是不是得先把这个女神给他建出来呀,对吧?那这时候我创建一个泪叫高底,然后呢,我说女神是不是一定都得有个名字对吧,是吧,那这个时候呢,我提供构造器,全程构造器,然后来个干赛的方法,来个to string方法CL savef,多余的313对吧,然后过来呢,我说男人,我们说男人是每个男人心中都一定有女神吗?刚才那个他都不是说不一定了吗?对吧,他有可能是男神是女都有啊对吧?当然要是严格的说,不是每个男人心中都有你什么对不对,就含义就想说一个什么意思,就说有可能这个值就没有对吧?对,有的人有女神,有的人是不是没有女神呢?但是女神他一定有名字吧,哎,就类似于这样的。
18:51
啊,这个大家要区分这样的值,那比如说呢,通常这个类我设计好了以后,我就怎么用呢?我可能啊,我就在这里用,嗯,放下边吧,对吧,呃,例题对吧,例题那我们可能怎么用呢?我就来个public world test1嗯几了呗五对吧五然后呢,我现在要干嘛呢?比如说我写的写个需求,说需求是干什么对吧,说我要我要获取一个男人心中对吧,心中女神的名字,这有没有可能,这大家能明白这个意思吧,说返回女神名字,比如叫god gode叫做name对吧,获取女神的名字,但是呢,这也有未知的数据参与运算吧,我说你获取哪个男人心中女神的名字,你说不是得传过来啊,传过来个man,然后呢,我在这里就return men.go呃,Get get。
19:51
啊go.get name是不是我们就这么做呀,对吧,是不是这么做,那这个时候呢,我们可能就创建一个men的对象newman,对吧?然后呢,我是不是就来个叫men点,呃,调用这个方法呀,叫get office name这个方法吧,我是不是把们传过去,他会给我返回一个女神名字吧,拿到女神名字我们是不是可能输出一下啊,谁知道一下对吧?那这个时候一运行,你觉得会发生啥?
20:25
是不是控制异常就发生了呀,那右键一个运行是不是就控制异常,这为什么呢?因为这个男人没女神对不对,对吧?所以说他里边的那个,当他get god的思的时候,这是不是得到一个no啊no.get name是不是控制针了,对吧?那控制针就是这么发生的,于是我们说怎么解决,我们通常是怎么写的,哎,我们说是判断一下啊,我们说if,那判断的话,Men是不是也得判断一下,什么也得判断吧,对吧,说如果men不等于no,对吧,我就return,呃,叫做慢点啊,不能return是吧?啊,如果不能对我还得if一下,如果if对吧,慢点对,如果不能,那我就获获取女神,获取女神呢,那就慢点叫god,是不是获取这个女神呢?对吧,得到一个god go。
21:25
只d ness对吧对吧,然后是还是判断对吧,找Gn.GN要是再不等于no对吧,我说不叫re return一个GN,点上get name啊对吧,说如果men等于no,那么我就直接return了,谁呢?Return苍老师说来个默认值啊对吧,说有女神就返回女神的名字,没有女神就返回个默认,默认的女神可以吧对吧,那这回呢,我们控制异常还有没有了,那说就彻底没了,又见执行是不默认的,就是苍老师了对吧,这个男人默认的女神就是苍老师对吧对吧,那原来咱们是不是都是这么解决的呀?对吧,这么解决,那这么解决呢,实际上也没什么问题对吧,但是呢,假如说我们说现在呢,仅仅是我们是不是关联个god啊,然后高是不是有个name啊,那有可能。
22:26
比如说我说我这个女神心中呢,就有个男神,男神心中呢,还有个别人是也可能啊,那这个时候我要是获取获取女神的这个,再获取下边,再获取下边,那岂不是我这个要写起来没完了吗?这个也就是你的意思要欠的特别深吧,对吧,之前我们说了你这个大括号如果写的太深,可读性是不是也差呀?当然你也可以反过来判断也是可以。就吧说如果等于no,是不是就直接return曹老师啊对吧,然后再往下判断吗?对不对,那这样的话你是不是就不用嵌套了,就是不用嵌套了呀,对吧,不用嵌套了,但是不用嵌套你也要if很多步对吧,对吧,当然我们原来也这样写习惯了吧,对吧,不习惯了,明白我也习惯了对吧?当然现在呢,有了JAVA8以后,我们就有了另外一种选择,对吧,又有一种选择,那就是用这个optional容器类对吧?那比如说如果我们用option容器类的话,我们可以怎么选择,怎么做呢?比如说呢,我现在来一个来个叫什么呢,来个newman什么新一代的男人对吧,然后呢,他说也有女神呢,但是注意我们呢,可能就要这样设计了。
23:41
我是不是把那个女神封装成option了,对吧?然后呢,把一个女神包装在o personal这里边吧,叫godde对吧?Ess等于注意的是什么呢?我们说什么样的值给它包到O动里呢?是什么样的植物呢?包装到option里,那就是那些有可能有,有可能没有的值吧,对吧?比如说刚才我们如同我们举的那个简单的例子是说说有的男人心中是不是没有女神呢?那他是不是就有,可这个值有可能被闹,所以是这样的值,我就可以把它包装到OB里,那再过来比如说我们说再看这个gods,我说你谁说一定得有个名字啊,对吧?所以说这样的值你是不是就可以不用包装,是这意思对吧?断了断了,断了说没有断,好像我碰着了,但是我也没碰着,我感觉。
24:43
好就有吧,是不是啊,对吧,然后我们说这个内它是不就是一定有啊,我们说这这样的值就没有必要把它包装到optional里对吧,那么所以说这个高呢,我就得给它包装到option里就可以了,但是大家注意,我要是不给它赋值对吧,它默认是什么值。
25:06
哦,沈总,我没赋值,它默认是什么值?空是什么?是不是no啊,那我old它是不是也是个类,它既然也是为,那我你要是给它做个no,那是不是整个这个open动也就没啥意义了,对吧,因为弄机会我要调调用它的方法的话,那它还会引发控制针的吧,它也是个对象,那是不没意义了呀,是吧?那么我们说用它的话呢,我们通常就不能负now了,我们可以附一个A是成点activity吧。是,是不是一个空的openal,而不是闹吧,对不对,对,表证我也保证option是有对象在的,对吧?然后它包装那个容器,它它包装的那个对象,我们是不是就可以做进一步的处理了呀,对吧?那么接下来呢,其他的就都一样了,这个构造器有无参的,有全参的对吧,有get s方法对吧,Ctrl shift f,多余的313,再来一个to string方法,对吧,再设F对吧?那这个时候呢,注意看返回参数传是不是传open的了呀,返回值是不是也变成option了,对吧?那这些呢,都得注意一下,那这次回来我们说这个方法我们就可以怎么写了呢?叫做public返string,叫get呢,Go god name2吧,然后呢,这次呢,我们就得来newman,是不是新的男人呢?
26:39
对吧,那这样的话我就可以返回什么了呢?对吧,我们就可以返回return是不是men呢?Men点上叫做是不是可以哦点等于好了啊闷同行,我这个闷你是不是为了防止空闷,是不是有可能传进来的也是no传进来的,这个有没有可能是no,有吧,所以说我他我是不是也可以给它来个optional包装一下啊对吧,来个newman是这意思吧,对吧,或者直接就闷得了,就是闷对吧,然后这样的话用also有什么好呢?那就可以闷点all else get。
27:22
是这意思吧,说如果你传过来的是闷是闹,我就给你,怎么样呢,我就用一个new,闷是代替一下。这可以吧,对吧,然后呢,再来是吧,然后如果那这样的话,我能保证这个闷它一定是有对象对不对,不管是你要传进来的对象,就用传进来对象,你要没传进来,我是不是有个默认的对象啊,对吧,然后呢,再来点盖的高的意思,这一步先说能可不可能有控制异常发生了先。有吗?先不用看这红线啊,是不是肯定没有了呀,你传过来的要是闹对吧,我这有个默认的对象给你准备着呢,你传来的不是闹,那是不是就获取这个不是道的了,对吧?那所以说get god这一步是不是没控制根了啊?那么再来钙和godde,它得到的是一个god丝是不是得到的是什么?得到是个O吧,说返回来也是个option包装的高LY是吧?所以说于是我在这里也可以点o else,我就可以拗一个goddess,说你要是没女神呢,我也给你来个默认的女神。
28:34
行不行,这是一种解决方式吧,然后再点叫呃点get塔内,这样的话控制针还有没有了,是不是没有了呀,对吧,我们可以跟上边下边稍微对比对比。对吧,好像也没少几行是吧,但是这样的话,它是不是也有效的避免空针呢?对吧,但是是不就一顿点啊,就点的方式就可以了,那这个时候呢,我们就可以测试一下,比如说现在什么情况呢?我调了get go name2对吧,我先传的no指的是那个男的就没空了吧,我这个右键,呃,不,它会给我返回值了啊使string s TL吧,然后拿到它以后我c out s tr右键运行。
29:24
一和这哪来的,嗯,哎,这个控制针是哪来的呀,74。men.all else啊对,那我这个men对象,我这个构建它的时候,我们是不是不能构建成这样的呀,对吧,我们是不是得构建成是不是O呢?对吧,因为我们O用的O嘛,对吧,就op点上,我们可以用这个op点上叫做of,不是op是吧?O personal.op t al al点叫做of no老师通常用这个去构建呢,对吧,然后把要传过来的no,那这个时候呢,我就可以op传过去吧,做op传过去,但是虽然说我们那个new内是不是也是no,对不对,但是我右键运行是默认仓老师啊对吧,因为这样的话,他给我把这个对象都给我们包装起来了,是不都处理了呀,没有闹控制针异常发生。
30:34
那这个时候这是没有,那这个时候我们是不是就new一个newman呢,对吧,但是女神是不是没有啊,女神没有,那默认也是苍老师。看懂啊,那么这个时候呢,我是不是要给他再传一个对象啊,这回传谁呢?传个option,嗯,T t tal对吧,然后是不是也得构构建个这个东西啊,叫高点叫做GD吧,G吧,等于叫做option,点上of novel是不是也来个no啊,然后把GNGN传过去,那是不是默认还是。
31:15
苍老师对吧,那这样的话我就来个叫new一个高底丝对吧,然后这个呢,叫做波多老师,这几个我都不知道,我都是听别人说的,是不是都有啊啊,你们都听我说啊,我我是听之前班里学生说的,因为别的东学的学生中是这么告诉我的,是说我的电脑里除了有这个童刚老师的视频以外,就是苍老师和波多老师的视频了,没有,所以说我觉得他们俩是不是也是搞it的呀,跟跟张哥他们应该是同行是吧?对,应该是,我觉得应该是对吧,行了,咱们说说就行,你们出去面试的时候不能这么说,听明白吧,对吧,你们不能说说我,我自学的张老自学成才对吧?我看了童彤老师的视频,我看了汤老师的视。
32:16
啊好了,那这个呢,就是对吧,F10。
我来说两句