00:00
下面呢,我们来说第11个特征,叫增强的死追vpi,死追PI呢,是我们JAVA8当中引进的啊,我们也说过了,说JAVA8当中最主要的两个变化呢,是string命PI和拉姆达表达式。啊,而这个string片呢,是我们Java标准库的最好的改进之一,哎,能够让我们这个开发者呢,能够快速运算啊,有效的利用数据进行并行运算啊,同时的话呢,我们可以在内存层面对我们集合和数组中的数据进行过滤,排序,规约映射啊等等这样一系列的操作啊,非常的方便啊,也是呢,饱受赞誉,那在我们这个JDK9当中呢,对我们八当中的死追一篇呢,做了一些改进啊,这里的改进呢,主要呢,就是体现了几个方法。啊,在我们stream这个接口当中呢,添加了四个新的方法,叫job well take well of noable啊还有一个呢的一个重改方法啊同时的话呢,还在我们这个optional啊,Optional呢也是我们JDK8当中引进的一个类啊,这个类呢是对我们呃对象的一个封装,封装哎能够避免的出现空指针的异常。
01:17
那在这个optional这个类当中呢,多了一个方法叫做stream方法,哎,方便呢呢,由我们从optional得到一个stream。行下边的话呢,是我分别就这四呃四个方法,加上optional里边的一个方法呢,做了一个演示说明,那这里呢,我们就通过代码上来去实现一下,那这里呢,咱们就直接呢来打开基于JDK9的了啊,我就不在八里边儿去写了,新建一个文件啊,这个文件的话呢,主要是针对我们stream来讲的啊,那这呢,我就写一个stream的一个测试。在这个JDK9当中,我们刚才也提到了啊,主要呢是新增加了四个方法。啊,这个九中啊,针对于这个stream啊,新添加的。
02:03
啊,新添加了。哎,我们说四个方法好,那这四个方法呢,我们先来测试它的第一个方法,叫做take well。好,下面呢,我们来写个例子啊,台词一。行,那这个take是什么意思呢?首先呢,我们来看一下。嗯,这well呢说用于从stream当中获取一部分数据,接收一个predictdicate来进行一个选择,这是一个我们说函数是接口了啊,这二八当中我们又讲解了,然后在有序的stream当中呢,Take well呢,返回从开头开始尽可能多的元素,好这呢我们直接来举一个例子啊,哎,我们这儿呢,生成string的方式呢,有好几种,哎,我们这里选择是通过集合来进行获取。哎,我左边是一个list。啊,这里存放的数据呢,不妨我就用integer类型。
03:02
哎,我们知道泛型的话呢,是不能不能够使用基本数据类型的,那list等于那右边呢,我就这样子来处理了啊a list.as list,我这呢就随意的放一些数据,呃,目前呢,这些数据呢是无序的。行,那这个数据呢,我就写成那么多,然后的话呢,我通过这个例子呢,我们去获取一个stream。啊好,这呢,我们就得到一个这样的stream,得到这个stream以后,嗯,那我通过这个的话呢,我去调用一下咱们刚才提到的叫take well这样一个方法里边呢,需要传入一个叫predictdicate啊,是一个断定型的一个接口啊,那我们比如说X啊指向的说X等,嗯。小于,比如说70。好,然后呢,我这里呢,做一个for each。哎,这呢是一个方法引用。
04:02
好,这就写好了,这呢就是咱们这个叫take啊,它所表达的意思呢,就是哎,当我们满足这个特点的时候呢,我就take take呢就是要啊,就是你可以理解为呢,就是输获取的意思啊,呃,那这是一个了,然后再接着这个呢,呃又要,这个呢又要,然后呢,这个呢,已经不满足小于70了,所以呢就不要了,进而呢,我们这个呃,Stream当中呢,应该只有三个元素。哎,这呢,就是我们最初的这三个元素啊,123啊,这三个元素好啊,这是一个了,然后呢,我们再演示一个啊,说如果我们此时的这个list,我们还以这个音节为例,是一个有序的。A risk点,然后呢,As list,哎,我这就写个12345678好这样的一些这个数据了,写完以后的话呢,我再通过这个list一点调一下stream,再调一下这个叫take well,哎,我这写X。
05:01
嗯,它呢是小于,比如说五点,然后FOR1一下。哎,这就可以了啊,然后然后呢,我们在这两个操作之间呢,加上一个换行。来执行。啊,这就可以了啊哎,就输出了1234啊这样的啊,哎大家呢,需要注意我们此时的take well呢,它不同于filter,不是过滤啊,你会发现呢,我们上面这个数据当中呢,呃,这个前三个,呃,你像如果要是过滤的话呢,后续像这个数据呢,也会出来是吧?这个也会出来,它这不是的啊,它是呢,就是从前往后尽可能多的去取,一旦发现有一个不满足的,我就不要了,不管你后边是不是还有满足的,他都不考虑,那如果后边也考虑,那就成filter了。啊,这个大家注意一下这个区别啊,行,这呢是咱们说的这个叫take well这样一个方法,那接下来呢,我们来看一下这个第二个方法,第二个方法呢,叫做job well。
06:09
哎,这两个方法的话呢,应该属于这个叫互补型的哈,这well的话呢,与take well正好相反,返回剩余的元素啊,那这个测试呢,就比较容易了,我们把刚才这个代码呢,CTRLC啊,直接呢我们粘过来,这个呢我们改成这个叫二啊,然后呢,我们在这个位置呢,改成叫drop well。哎,同样的道理,CTRLC把这个呢也做一个更改行,那这个时候呢,我们再来做一个执行,他们两个呢,属于一个互补型的啊,也就说我们这个job well呢,与这个take well呢正好相反。哎与,哎,我们这个结构啊,正好相反。那反馈的这个数据的话呢,他们就属于这个互补型的,那比如说我们刚才呢,说在X小于70的时候呢,Take呢是要,那现在呢,就是这个不要,这个不要,这个不要好这个呢开始要了,这个一旦开始要后边的话呢,就全都要。
07:09
啊,这是一个,然后下边这块呢,也是一样,小于五呢,我就不要,一旦呢,不满足小于五,从五开始,后边就全都要,哎,我们看一下此时的结果。啊,大家呢,这就看到了我们这个情况了。啊,就是呢,我们刚才take well的一个补集,相当于是。行,这呢是我们说到的这两个方法,那接着呢,我们来看一下第三个方法。哎,第三个方法呢,我们这里边呢,叫做嗯,Of novel啊of novel啊,说这个方法我们看一下它的具体使用,在JAVA8当中呢,我们要求stream呢,呃,它里边这个对应的元素呢,是不能是no的。哎,这时候大家注意啊,这个nu呢,就是说它如果只存了一个元素,这个元素呢,不能是no啊,如果要有多个元素,其中有存在nu的是可以的啊。
08:01
嗯,如果呢,你要是都是no的话呢,这就是控制音了啊,然后在这个JAVA9当中,我们多了一个方法叫a novel是允许我们啊这个存放一个单元素,而且这个单位元素呢是no的。哎,就允许我们这样做了哈,来举例子说明好,这呢是叫a novel。那这样一个方法来看一下。行,那这里边儿呢,我们来做一个举例子啊,那是这个情况,比如说呢,我们这时候这个STEM,咱们也说到了,它的实例化呢,有好几种方法,那其中有一种呢,就是恶物直接呢,我往里边去放元素。啊放元素,那放元素的话呢,如果我们放的是多个元素,比如我这写个123,然后呢写个no。啊,然后呢,Out enter一下。那我这呢,称作叫stream一行,那此时的这个STREAM1,我们呢,给它遍历一下看看。
09:05
哎,放一只。来执行。哎,大家看到了,此时呢是没有问题的哈,也就是说呢,如果我们的stream当中有多个元素,实际上它允许其中的这个一个呢,是no的,那接着呢,我们再来看。我这有个换行啊,我的这个stream呢,点of方法。嗯,我这呢是一个单元素啊,单位元素你写个一肯定没有问题哈,但是此时我写了一个单元素就是no。哎,那这个时候呢,我们执行一下。好,大家看到了,这时候呢,就报了一个控制针的一个异常。那也就是说呢,我们这个string里边呢,如果有单个元素是不允许这个元素呢,是为no的啊,就是我们所说的这样一个情况啊,大家呢,把它这个注释一下,在这里我们说明。
10:05
啊,这个如果只有单个元素啊,这个此元素啊,不能为闹。否则。哎,这个叫knock,哎,Poer的exception。行,这呢是咱们说的这样一个情况啊,然后呢,以这个为代表的,大家呢,也可以看一下我们这个PDF当中,我给大家写的哈,就是你呢,可以是new了一个list啊,Release里边添了一个元素,又添了个no,这个时候呢,你去调一下stream啊,这个呢仍然不会报异常啊,你调一下它的count有几个元素啊,哎,是有两个元素啊,就像咱们刚才。哎,咱们刚才的话呢,在上边这个演示呢,它就是有四个元素嘛。那刚才这块这不就有四个元素是吧?哎,这是不会出问题的啊,那不能放单个元素。呃,能放单个元素,但单个元素呢,不能是no,那现在的话呢,我们在这个JDK9中,哎,新增的。
11:02
还有一个方法啊,叫做of novel。那原来呢,此时我们就允许啊,你来存放这个no的元素了。啊,这是一个T类型的T啊,举例子我们这个时候呢,是stream点叫of nob啊,比如我先写一个啊,先写一个叫Tom。这呢显然是非空的,哎,这个呢,我们叫STREAM3。啊,我这呢,换一种方式啊,STREAM3点countt点啊out,看一下这个STREAM3当中元素的个数。哎,那显然呢,就是一个嘛,哎这个呢,毫无疑问啊,那现在的话呢,我们说它就允许我们这个of novel里边呢,是存放not纸的,看我复制一份,这个位置呢,我就写成是个闹。哎,这个呢,我就成四。啊,这个写个四,那如果我们像刚才用of方法,它就不允许这是no,但是of novel呢,这个健壮性就要好很多。
12:04
嗯,这时候呢,没有报异常,而这个结果呢,就是零,哎就是这个时候呢,它不认为这里边呢是包含这个元素的,因为你是个空啊,哎就是这样个原因。好,这呢,就是我们所说的这叫of novel啊,它里边存放的元素是可以为空的啊,T可以为空。好,这个呢,是咱们说的这个第四个方法啊,呃,第三个方法,然后第四个方法呢,是新增加了一个叫重载的方法啊,这个方法呢,叫做E。啊叫做好,我们看一下。但它承载的这个方法。行,这个stream的话呢,我们创建它这个对象的方式呢,其实主要呢,有四种啊,第一种呢,是通过这个集合去创建,这个呢,简单做一个算是复习了啊复习什么呢,就是stream的一个实例化。
13:11
哎,它的实例化这个方式呢,呃,方式一是通过我们的这个叫集合,哎,通过集合啊,这样的一个方式啊,第二集合的这个死追用方法。那这是一个啊,通过集合的。哎,四只用这个方法,这是第一种方式啊,那第二种方式呢,是通过这个数组,哎,这个数组准确的说呢,应该叫数组这个工具类啊叫ari。哎,通过它呢来进行创建,然后第三种方法呢,就是我们刚才看到这个STEM,它中的这个静态方法,哎,叫做of,哎,它也是可以的,那还有一种方法呢,就比如还有这个方法啊,当然这三种呢,是我们主要用的,就比如说咱们现在提到了叫eer。呃,这个方法以及呢,它还有这个叫generate。
14:02
哎,类似这样的方法啊,但是我们很少去用,那现在呢,我们就说一下这个叫ter这个方法。这个这个方法呢,在STEM本身这个声明这个结构的时候呢,就有这个方法了,只不过当时这个方法呢,只有这一项。啊,现在呢,是新增加了一个这个方法啊,是重载的,那我们先来看一下原来这个方法,原来这个方法的话呢,里边这个参数ctrl alt斜杠。啊,先来填写一个C的,比如是零,然后呢,后边呢,我们需要做一个相关的运算了啊,比如说X对应的叫X加上一好,这是它对应的这个E了,返回的呢,就是一个stream。哎,那我们就让他呢,做一个,比如说this out的一个。呃,先这样是吧。啊,做一个这个for each的一个操作啊,嗯,System out。哎,啊行,这时候呢,大家注意看啊,此时我要是运营会出现什么样的情况。
15:04
哎,大家看这些时候呢,这个代码上就停不了了啊,每次呢,就是哎加上一个这个一是吧,哎加上一个一的这个情况。那就是这个情况啊,那eter呢,它就相当于从零开始啊,一次呢就是迭代啊,一直往后运行,那没有一个终止条件,它就一直往下去执行了,所以通常情况下呢,我们使用特这个方法的时候呢,都习惯上呢,会有一个像limit这样的一个结构,比如说呢,我们去限制一下,我们只需要它便利前十个元素。哎,这个时候呢,就会指出来前十个元素了,这是通过这个limit米的方法进行的一个限制啊,这个不多说,我们现在呢,想说明的就是,哎,在咱们这个JDK9当中呢,关于这个以特这个方法呢,又多了一个重载的,我们可以通过另外的方式去啊控制它的结束就是这里所谓的叫predictdic。啊,就是有一个断定型的一个啊接口啊。
16:03
好,那比如我们还是演示这个事情从零开始,嗯,先来写一下,这个叫predictdic,我们呢,比如要求这个X哈,嗯,它得呢,嗯,小于比如说。十。啊这样子的,然后呢,X对应的叫X加上一个一啊,这个时候我们再做一个for each。呃,这个呃,X。传入一个值,保证它是小于十的啊,这个是一个逗号是吧。点,然后呢,For each。行,这我就写好了啊,写好以后的话呢,我们再来执行一下。哎,你看这也没有问题哈,从这开始,哎,我们这儿呢,要求它是小于十的,哎,就是此时的话呢,我们可以通过一个呃,相当于一个判断语句啊,来控制它的一个终止,而不像原来一样得通过这样的类似的方式去做了,行这呢就是我们说到这个stream当中新增加的这四个方法。
我来说两句