00:00
好,这个呢是string API,然后最后呢,关于叫optional这个类,诶这个类的话呢,呃,应该我们说可以看到的,包括呢,它在九十十一当中对这个类呢,也不断的去优化,呃通过这个它优化的轨迹你能感受到,这个类的话呢,它要被重视的啊,它要被重视的就是有一些呢结构啊,这个提供完以后,后边呢再也不用它了,而且呢,时不时的还加一些deprecate这类呢,基本上就失宠了是吧,后边呢可能就要被替换了啊,那这个optional这一类的话呢,在我们JAVA8提供以后,首先我们在死猪API当中其实也看到了他用optional了,其次的话呢,在九十十一当中,他不断的去加点新东西。哎,你就能感受到这个它的一个特点了啊好,那optional首先呢,关于它的一个理解,这个在我们这个PPT里边呢,有说明啊,就是这块这个optional的话呢,我们也可以把它看成是一个容器,这个容器的话呢,就是装东西的,咱们呢提到这个词其实是在集合中讲的。那集合的话呢,是一个典型的容器,可以装很多数据,那其实数组也是。
01:02
那其实的话呢,String buffer string builder string也算是,只不过呢,你们呢,都是object的类型,比如说数组里边,呃,集合里边object类型的这个数组,那这个数组呢,当然就是就本身就是数组了,那你要是这个string string buffer string builder,只不过呢,人家对是这个差型数组,当然这个差型数组这个事的话呢,在后边去说这个底气又不足了,为啥呢?在我们这个新特性当中,他把这个底层差盈数组也给改了。啊,这个咱们说到的时候呢,会讲这个新特星啊,今天会讲,那在这个八及之前的版本当中,我们都知道它就是差型数组,那既然数组了,那一定也是容器,所以这呢是非常典型的这个容器啊,能放多个数据的,那么我们也可以把另外的一些结构呢,也看成是容器,比如说包装类。对现有的一个基本数据类型做这个包装了,你也可以看到是个容器,只不过这个容器呢,就只能放一个容器。嗯,就放一个具体的,你是in的型的还是波尔型的一个数,那也可以呢,把我们这里边optional也看成是个容器,这个容器呢,其实也就放一个容器,就是我们实际上你想保存的这个这个数据,哎,保存这个数据,这个数据的话呢,我们是通过这个泛型呢来体现的,泛型呢,咱们前面讲过了,这个泛型的T在你真正给它赋值的时候,是不是也只能是一个零类型。
02:22
基本数据类型是不是不能够去实例化,我们这个翻行参数啊,对,就是都得用想,你要用想想用基本数据类型都用包装类,所以这块呢,我们重装呢,其实是一个引用类型的数据了啊,当然有包装类的存在,所以基本数据型相当于也就进来了,那它呢,里边保存的就是这个数据,这个数据的话呢,我们有它的一个目的,就是说哎,这个数据原来呢,直接去调你这个引用类型变量,或者通常是个对象了,调方法,调属性,说经常容易控制帧,现在呢,凡是对原来这个T的调用都转换为对我们optional这个类对象的一个调用,那我们尽可能的去设计这个option类,避免呢,让你这个气呢点的时候出现控制人的问题啊,就是为了控制人而生啊,所以这里边你要说最简单的关于它的理解,一句话就是为了解决诶Java中的。
03:15
这个空指针啊,问题啊问题啊而生。当然这个生的话呢,也不是Java里边先生的哈,是人家谷歌这块呢,先在这个一个项目当中引进来了,Java呢就给它包进来了,也就是这个语言的话呢,像Java要想保持持续的生命力,它需要呢,不断的去借鉴一些新的一些呃项目啊,或者新的一些语言当中人家的一些优良特性,哎,把它呢融进来这样啊,当然呢,这个它再融也是基于原有的这样一个语言的加构的基础上,所以其实我们Java呢也不容易是吧,你会看到它越来加东西越多啊,越来越臃肿。那肯定不如后边呢,突然把这个都推掉,新出一门语言,可能有的可能要好一点,是吧,比如现在很多成员都看重这个go语言。啊,这个go语言,Go语言呢,应该说也是一个非常好的语言是吧,号称呢,具有呃,Java的这个运行效率啊,同时呢,具备这个Python的这个编写效率啊这个Python的话呢,大家咱们也没有讲过啊,后续大数据的同学呢,要讲一天的Python,咱们Java呢就不讲了啊那一天是吧,你都学过Java了,你再学别的语言,对你来讲是不是都是小case了是吧?啊这后边呢,还讲skyla skyla这个语言的话呢,就讲一周。
04:29
啊,因为你都学过Java了,你要没有学过Java讲skyla,那又得讲上快一个月的时间了,对学完Java了你不要有底气嘛,是吧?啊然后再学别的语言的话呢,就是告诉你哪些不同,它是怎么用的啊,怎么面向对象的,跟Java有哪些区别啊,你一对比啊这么回事就很快就能上手,其实啊,那么这个咱们后边那接入Python的时候呢,你会发现Python上手写代码其实效率很快的啊,编写起来很快的,比如我们写一个最常的输出语句啊,system.out.print LA是Java,直接呢Python print LA print就完事是吧?哎,这个Python的话呢,在定义变量的时候也非常快啊,连类型也不用写,直接就变量直接赋值就完了。
05:11
等等啊,就是Python的话呢,应该说编写起来是比较快的啊,它的特点就是这样子,但是Python运行起来它可不快,它的运行效率不太高,他都得占一个,然后同时他有这个相应他的缺点啊,那Python干什么用呢?就是大学里边,比如说这个教授呢,需要学一些数据分析了,这个时候呢,他用Python就可以,他写起来可能快,那跑的话呢,就那就跑起来就完了,那你说让他用个Java去写,用个C去写,写这个程序就花了一周。然后一跑啊,十分钟跑完了是吧,那你就不如他洗的时候可能花了一天时间洗完,然后跑的话呢,可能就花了半个小时或者更多,反正他也不用特别关注于运行的一个效率嘛啊,他需要呢,尽快的能把这个功能要给它跑起来,所以呢,你就可以用Python去做啊,就Python呢就是编写的快,运行慢,Java的话呢,就跟他正好可以理解成相反,呃,编写起来呢要慢一些,同样比如你做个电商项目,用Java去写的话呢,你可能需要这个看你当然也看项目的大小了啊,比如你需要花半年的时间把这个电商的后台搞定了,那么你要用Python写的话呢,可能一到两个月就可以搞得定。
06:14
代码量也非常小啊,这就是同样的可以做一样的事情,Python就编辑起来要更快,当然这个运行的这个效率啊,那这个Java的话,我们说要比Python要高一些的,那go语言呢,说我兼具你们的优点是吧。啊,你不是编也快吗?我编也快啊张然,你不是运营快吗?我跟你一样比Python还好是吧,就是后边呢,也会出现一些新的语言,也不排除大家以后呢,可能也会接触这样的一些语言啊,这个在公司当中,你肯定那个基术要不断的去升级的哈,不排除以后呢,你做着做着Java就做成够了,但家注意啊,当时白培训Java了,其实不对是吧?啊,因为你做过圆了以后,你再接受新的,其实呢,很多是可以直接迁移过来的啊,这个经验呢是可以迁移的,具体的一些业务呢,也是可以迁移的,就是语言呢,可能会有些变化啊,那你上手呢,其实比你刚开始零基础学是要快的啊好,这个我们再拉回来,就是从说了一个什么事呢,就是Java这个语言呢,其实越来越凸显出它有一些臃肿的一些点啊,当然这个Oracle公司以前叫S公司了,他也不断的试图进行优化啊,试图呢,就是让它变得呢,更符合现在的一个需求,比如说像大数据的出现,哎,Java呢,你就尽可能去迎合大数据的需求啊,比如说云计算的出现,Java呢也要去迎合。
07:28
云计算这样的一些需求,来去做一些语言层面的改变啊,像这呢,只是一个非常小的点,就是optional这个类啊,在我们这个Java写代码的时候呢,控制帧异常非常的恶心是吧,这块我们就提供了这样的一个类,用它呢尽可能的去解决我们的控制帧问题啊这呢,我们提到了这样的一段话,哎,CTRLC。嗯,这个我们给它先变大一点。
08:01
成这呢,就是我们关于这个optional类的一个说明,它呢就是对我们核心这个数据T的一个封装,但是你这个T呢,不是说呢,你本身可以是no,可能是no嘛,你要是闹的话呢,就是里边这个optional对应的这个值呢,就是一个空的,就是它也有空的情况,当然呢,我们可以通过相应的一些方法呢,去避免出现这个控制针,下边就涉及到常用的一些方法了。啊,然后典型的例题,呃,例题创业方法这块呢,我们在PPT里边列出来的一些方法啊,这个咱们之前讲的时候呢,这个因为是当天的最后了啊,显得会稍微有点匆忙,然后这个方法呢,也挺多的,咱们这块呢,稍微再把这里边最核心的几个方法呢,给大家再稍微提一下啊,因为这个类的话呢,后续咱们还是要应用起来的,哎,在八里边出现了后边的版本当中呢,对它也进行了一些优化,可见呢,就是它还是比较被重视的一个类。这呢,我们去新建一个module。啊,这个next一下,这个呢,我们就叫啊13。好,Src下呢,我们去新建一个包先。
09:05
哎,这个呢,我们写成啊,就还写成个Java了啊。在这个包下呢,我们去新建一个,还是来说一下,咱们这叫optional,诶关于它的一个测试,哎,咱们呢,再把它里边这几个主要的方法呢,再给大家去强调一下啊。哎,这个呢有个test,这个test的话呢,我al enter一下这个去做一个添加。这个OK一下。行好了,那首先呢,我们关于这个optional这个类的话呢,提到它的一个,呃,创建对象的方式里边有一个呢,叫做empty,那emptyt的话呢,就表示我们创建的这个实例里边,实际上你这数据是没有的啊,当然这个呢,我们一般也不用哈,咱们体会一下,我通过这个叫an optional,第二啊,有一个方法叫做empty,然后在这al enter一下,哎,生成一个叫optional,叫op啊。行,那这个op的话呢,我们可以呢去比如做一个判断,这呢就涉及到另外一个方法叫呢is present。
10:07
哎,这个present呢,就来判断这个optional,你封装的这个数据到底是不是一个no。这个。哎,封装的这个数据啊,是否为空,那因为你这是个empty,相当于就是空的啊,这里边我们写一句话。哎,比如说数据为空,哎,我们看看他能不能说出这句话,你就知道这个情况了。你看你看诶这个能看没有输出是吧?呃,Is pri呢,你看之后它没有输出这个效果,没有输出效果呢,那我们这块呢,就可以,比如我们去取一下它这个值,这个呢,我们把这个值的取你放在这。哎,这个op第二,哎,我们这个取值的话呢,这个叫get操作,哎这个get操作呢,叫一个取值了啊取值我给写到外边了。
11:02
你看这时候呢,报了说你这没有任何的value,也就是相当于我们此时你看调这个先看这啊,我调这个MT的时候呢,它里边呢,是提供了一个这样的MT付给这样的一个T了,这MT就是它用了一个,但其实里边呢,没有提供任何这个数据。但是呢,你这个对象是是有算是有对象啊,所以我们在这块呢,你判断叫is present的时候,哎,说这个value是不是个no不等于no,它就是个true。那相当于我们这块呢,你看我们这样,我输出一下,我输出一下这个事儿啊,我sit out,这个我们叫op啊直接呢,我就打印它这个呢,因为报异常,我们暂时呢,就给它去掉这个钙的方法呢,一会儿我们再诶强调一下它的使用啊。嗯,这个呢,它返回的是是这个MT啊,就是说是个空,当然呢,我们去输出一下,说这个op点叫is present,诶它这个输出的话呢,发现它是个false。呃,这个说is present说是否为空,它是个force。
12:04
是否包含对象否啊,是否包含对象的意思,那这个呢,就相当于否,就不包含对象呗,不包含对象写否了,那这我们就加个它吧。对吧,哎就是is prevent,就说你里边是否包含数,是否应该是这样说啊,是否包含数据,哎是否包含数据false就不包含是吧?哎,那你加一个非,这不相当于它就是一个空的情况得这样了,哈成这呢是我们说的这个叫empty,这个话呢,大家了解一下就行,哎通常咱们一般呢,也不会涉及到它这个get呢,咱们暂时也不在这去说,然后接着呢,我们说另外的一个配对的这个方法的使用。哎,配对的啊,那么这个option呢,除了我们调MT之外呢,你会看到还有这样一个方法和这样个方法,这两个呢,是我们相对来讲比较常用的,我们先来看上边这个调这个of的话呢,里边需要传个T,这就是说呢,你optional本身要封装的这个数据了。那这时候我们调一下叫optional点叫of,这里边呢,写个数据不妨呢,咱们此时就简单一点,拿一个字符串呢去重装,这个呢,比如我们叫hello。
13:11
行,然后呢,我把这个HR呢放进去,哎,把这个数据呢,相当于就封装起来,呃,造了一个optional的一个对象,里边封装的呢就是string,哎,所以呢,这个泛型就是一个string类型,哎就这样了啊,那有了这个op以后,这个OP1呢,我们就可以啊调它个方法叫做get方法。嗯,Get的方法它呢,主要就来获取一下你这个容器里边核心的这个数据,那其实在我们这里边呢,就这个hello了,然后al enter一下,哎,我们得到一个字符串,我叫S71,哎,我们呢去打印一下S71,哎说白了其实它就是我们的hello啊。哎,这呢就出来了,那这里边呢,我们提到了一个方法,一个呢叫of,一个呢叫get,那这个of方法我们需要提一下,我们如果去封装这个数据的话呢,这个用的恶偶方法,要求我们这个对象不能为空言IG,如果我们这个HR呢,我支撑是个no了。
14:11
它就是空的,那么此时再去,呃,看效果。看这容易报错了29行点一下。那29行就是这一行。那也就是说呢,我们这个调用这个恶物方法,哎调用它的时候啊,去封装这个数据T,哎封装这个数据T,然后生成,哎生成咱们这个叫optional的这个对象,哎要求要求这个T呢,必须要飞空,否则报错。那否则呢就报错了,嗯,然后呢,你看我们这个O这个方法里边,它其实也写着呢,嗯,在这里边啊关于这个参数,Y6说呢,哎这呢你是你传进来这个值,这个值呢必须是一个非空的,嗯,否则的话呢,它就报这个异常了,就啊行这呢是我们说的一个O,那要想不空,它就必须有数据,然后下边这个呢,对应的叫get操作,Get呢就是取这个值了。
15:14
就是取这个值了,这个由于你上边这块呢,既然是非空的这个值呢,就一定能够取到啊,就是我们get的操作,那这个get的方法呢,我们进去看一下,它其实取的就是我们这个optional,实际上你封装的这个数据就是这个value了啊,这呢也会出现一个异常,就是如果说你这个VALUE6没有的话呢,它就会报这样的一个异常,这不是咱们刚才通过上面这个呢,其实也看到过这个情况,哎,上面这块呢,你看咱们这就是一个MT了,就是个MT,此时的话呢,如果我们去。诶,输出一下这个op一点,咱们做一个get上面呢,明明你是个空的,我再去get就会出现这样的问题。哎,这呢点一下是在我们这一行出现的,哎,也就是说呢,如果你要真正里边没有这个TT是个no啊,这个盖的操作呢,尽可能大家就不要掉了。
16:04
嗯,所以通过这个方法的调用,我们在这说明一下这个事情啊,嗯,这个如果这个optional。哎,这个它封装的这个数据其实是Y6啊,是T类型的,如果它封装这个数据Y6呢为空啊,则这个盖的方法报错啊,否则啊,你要是不为空。哎,否则也是我们这个Y6部位空时。哎,不为空的时候,然后呢,你就哎返回一下我们这个Y6。就拿到我们核心的这个数据了,就这样一个情况,OK,那你想想啊,这个时候呢,其实就提到这个of跟这个get,他俩通常就是他俩是配对使用的。你要上边这块呢,它不报错,那就说明你这个T呢是飞空的T要飞空的话,这个get也一定能够拿到数据。
17:00
哎,所以这两个就搭配使用啊,这个钙的方法,我们说它呢,哎通常与咱们这个叫恶物这个方法呢,哎搭配使用,嗯,上边只要你不报错,说明你就有数据,那么getp呢也就不会报错,哎它也就能够取到这个数据,哎搭配使用啊,用于获取哎咱们内部的这个封装的数据啊,这个时候这个数据呢,是你上边叫T,是把这个T呢付给了我们这个Y6了,是这样的情况,好这呢是我们这提出来一对方法啊of和这个get,那这一对方法呢,其实要求比较严格,就是说呢,你必须得保证他们是非空的,否则呢,就抛抛相应的这个异常了,然后接下来呢,我们看另外的这一对,那另外这一对呢,就提到叫oh no,哎,就不要求我们这个T呢,是一定要飞空的了,说可以为空。哎,可以位空,这个当然咱们上面把这个注释一下啊,要不这块老报错了,哎,接下来我们再通过这个叫optional点叫of novel,诶里边呢,我们还写一个具体的字符串,提前呢,咱们给它提供好,哎这个呢,我们还写了比如叫北京。
18:13
行,然后o novel,这时候呢,就不要求你非得是一个飞空的了,我们先al enter一下,得到一个optional,哎,我就要一了,然后接下来这个op1.2,哎,咱们呢,哎,当然这时候你可以去调get啊,但时候你要小心一点,这个位置呢,既然可以被空,那要是真要空了这块呢,可能是不是就出异常啊。所以这里边儿你就别掉它了,不掉它呢,钓谁呢。诶,它搭配的使用这个叫all else,就用另外一个字符串呢,去充当一下。比如这个呢,我写成直接在这写了,写成上海。然后这个时候我们alt enter一下,得到具体的一个字符串二。好这样子,这两个呢,通常会去搭配使用啊,那在这个问题当中,如果我们去打印一下HR这个是谁啊。
19:03
现在就是北京。那这个o no呢,诶我们在这写一下啊,它这个方法呢,就是来封装咱们这个itr的。哎,这是T的一个小T啊,这个方法呢,相当于是咱们封装,哎封装我们这个数据T,哎然后呢,付给哎付给咱们optional它这个类内部的这个value了。那这个时候呢,我们说不要求这个T飞空,就是它有可能是空的。那目前呢,不空不空呢,那你这个Y轴呢,就不空,那all else这个方法的作用。对啊,All all else,这就是个T,我就要T了啊,说如果这个咱们option optional它内部的这个Y6非空啊,则就是返回此Y6值。
20:05
啊,那如果这个Y6为空,哎,是不是则返回我们这个T1啊。就这个意思能够保证呢,就是你返回的这个数据它一定是非空的,这个时候你T1你就别拿这个空值去替换了啊,你就你就非空就行了,那你看我们这个题目,因为我们这个itr呢,就叫北京了,所以这时候呢,其实里边的Y6飞空了,所以不会考虑上海返回的itr呢,就自然是北京。你看这就是北京了,成这是他,然后如果我们这个itr,哎,我这儿呢,给它复制为一个no,那他就空了,他空的话呢,这个诶我们说你去all else的时候呢,哎,那就以它来替换,那通过这块呢,我们尽可能的这不就把这个空指针内容问题给它避免开啊,这就成了一个上海了,哎这里边我们体现的就是of noble和all else这样一对方法的搭配使用。
21:01
哎,所以这两个呢,通常我们搭配着用,然后这两个呢搭配着用,如果你明确说我们这个呃,对象它就不是空,那你就用of和这个get去搭配着用,如果呢说有可能是空,那你就用a no和all else这个呢去搭配着使用,哎就OK了,成这就我们又把这个事呢稍微提了一下啊,那当然这个上面这个MT的话呢,这个大家了解一下就行,它就是明确的创建了一个内部的Y6是空的这样的一个情况。啊,内部外流是空的一个情况,这不刚才也看到了,哎,是他然后给的这个这个这个呢里边呢,是他他这里边造了个对象,这不有个闹吗?哎,相当于我们这种情况啊,调的这个叫MT这个方法。嗯,创建的。哎,创建的我们这个叫optional,哎,这个对象啊,内部的value啊,相当于它是一个no。那就是这样的情况啊,好这呢,就是我们提到了这样的几对方法,嗯,这几对方法其实就我们这个所谓的这个常用方法了,除了这个之外呢,还有其他的一些,这就看具体一些场景了,我们相当于还可以拿着你这个对象去做相应的一些事情啊,这就涉及到下边一些方法的调用啊,先在把控住我们如何去封装这个optional啊,这个核心的数据,哎把这几个呢,我们CTRLC一下,哎,咱们放到这就可以了啊,行,来搭配着去用,然后后边呢,咱们举了一个具体的例子,哎,就说这个,哎男孩有这个男朋友女朋友这样个问题。
22:34
嗯,在这里边儿,这里边儿呢,主要咱们体会的话呢,应该是这个结构了,诶把这个呢,我们CTRLC一下,包括下边这个测试咱们也拿过来啊CTRLC。哎,CTRLV一下,你看在这怎么体现呢,咱们这块呢,调了a novel啊,就是你这个呢是可以为空的啊,然后封装出来了,封装出来以后呢,你要不是空呢,那我就取你这个Bo了,也就是这个boy这块呢,就是相当于这个BO1了,那如果说你要是空,那我就拿这个呢Bo去充当保证你这个是非空的,哎这个呢,再调这儿就不会出现控制人的异常,然后同样的道理呢,你这个返回的值可能是空的,哎,可能是空的话呢,我们就调r else给你再补充一个备胎,你要不空,那勾一就是这个勾,如果你要是空,那就是它,哎这个时候呢,再返回保证这块呢是非空的。
23:26
哎,这呢就体现了这个叫诶尽可能的避免控制异常这样一个场景,诶下边是一个简单测试了成这呢就是关于这个option这个类。
我来说两句