00:00
好,我们继续研究JAVA11当中新加的一些API,那么刚才我们研究的是针对于集合增强的一些个方法,那么比如有of方法,还有什么?呃呃,两个of和copy of方法,那么这两个方法它是一个增强的,那么对于我们流来说呢,它也有一些增强方法。好,我们来写一个测试stream test,好,那么在stream test当中,我们来简单回顾一下这个流的一个啊处理啊,流的处理,流的一个增强,那么在讲之前我们还是简单再来回顾一下,诶,我们说流的创建怎么创建来着,刚才就讲到了一个非常常用的方法叫O,好,那么它也是。
01:00
非常通用的好,比如我在这里添加一些个,哎,在of方法当中加上一些数据,哎,加上一些数据好,然后呢,我们说这个of方法就可以把这个散列的数据整合成一个流对象,那么流对象里面,哎,那么它就有这么几个元素,有这么几个元素好然后呢,我把它保存一下,好保存一下,然后呢,STREAM1好,然后呢,这个流一旦创建以后,我去打印输出它有意义吗?能不能把这里面的元素都打印出来呀?啊不能注意硫的处理它比较特殊,为什么呢?因为这个流它是一个比较抽象的,它并不是数据的存储,所以你去打印,它没有办法打印出结果,所以怎么办呢?啊,我们说流的处理是不是有典型的三个步骤啊,好,简单的回顾,那么硫的处理的简单的三个步骤。第一个。
02:00
是什么?哎流的一个创建,哎或者说这个创建流,哎创建流好第二步操作是什么呢?哎,是一些个我们称之为流水线的中间操作,然后呢,最后一步是什么?哎终止操作,所以流必须在终止操作的时候,我们是不是才可以对里面的元素进行更加的。进一步的一个处理啊,哎,终止的处理好,那么终止处理当中典型的就是谁呢?就是这个迭代for each,那么for each迭代的时候,它需要一个consumer啊,注意这个函数式接口consumer消费者,那么这个消费者干什么呀?啊,消费者的作用就是让这个流在for each便利迭代的时候,把这个流里面的每个元素是不是都要经过这个消费器对其进行消费啊,那么我们说在这里,如果我们用这个比较简单的方式,拉姆达表达式来做的话,就是一个参数,然后呢,哎,我在这里哦,把它打印输出一下,诶打印输出一下,这是一种写法,这种写法呢没问题,但是呢,我们还可以是不是再进一步简化啊,因为这个方法consumer这个方法的模式是有参数无法回执。
03:29
Printline呢,也是有参数无法绘制,所以这两个方法的模式是不是一模一样,所以我们在这里就可以用更简便的办法来做,是什么呢?方法引用,哎,方法引用还记得吧,好,System out,注意方法引用是双冒号,然后呢,方法括号通通都不需要了,因为这个printline方法和我们的consumer当中的方法是一模一样的,哎,一模一样,好,这样的话我就终止来运行这个程序,然后呢,我们来观察它的结果,诶,那么这里面的数据是不是就出来了,好,出来了好,那么方法就可以把散裂的数据整合成流对象,进一步进行进一步的处理好,然后呢,如果我在二五的时候,比如哎二五的时候,我在传参数的时候什么也没传,诶,那么我们说什么也没传,那么这个流当中有内容吗?好,我们来看一下。
04:29
The stream2,然后呢,我给它终止一下stream.for each,哎,方法引用sent out,双冒号print line,好然后呢,我们再来流一和流二中间来一个分隔线,然后运行程序,我们来观察,那么这个流二当中有没有内容呢?诶,我们发现没有东西输出,为什么呢?因为你的of方法里面是不是什么都没传啊,哎,什么都没有传好,那么这是一种特殊情况,那么这个流中有没有数据啊,啊,流中没有数据,哎,没有数据好,那么流中没有数据和另外一种情况,流中有一个nu,大家说一样吗?哎,注意是不一样的。好来看一下,我这回再创建一个3STREAM3,然后二五的时候呢,我传入一个nu,所以这个不是没数据,而是有数据,是个什么数据啊,是nu数据好,然后STREAM3,我再来去。
05:29
控止便利它好,这里在这里其实有一个警告,哎,有一个警告,至于这个警告我们先不管,然后呢,我们来运行观察一下会不会有问题,哎呦,出现了一个异常,空指针异常,为什么会出现空指针异常呢?哎,那么刚才我们都什么都没传,没有空指针,反而那么传了一个nu呢,反而有空指针,为什么?哎,因为这个nu其实它被理解为什么理解为这个可变参数的这个数组对象了,这个数组对象是不是为纳了,哎,所以它是一个数组对象,传进来是nu,那么继续追踪这个数组对象是不是要传给这个string方法好进来A,那么这个数组对象显然传进来为nu的话,在这里none的点lengths是不是出现控制键啊,所以根源在这里,哎根源在这里,好然后呢,我们再回过来,哦,那你这个on nu是不可以传入的,好,注意传入nu,哎传入呢,会被解析为是什么呢?哎,解析为是一个是一个什么呢?数组对象,哎,数组对象好,那么在创建的时候会访问会进一步。
06:47
访问它的什么长度信息,访问它的长度信息,所以你传入,那调用它的lengths就出现控制针,所以这种写法行不行啊,不行,哎,不行,但是我们说在恶方法的时候,真的有没有可能传入一个空呢?同学们有没有可能啊,是有的,哎,是有的,所以像这种情况我们该怎么办呢?哎,你又有可能传入呢,又要防止空指针,那么我们说在JAVA11当中就添加了一个新的方法,叫什么叫of no,哎,Ofable o noable noable什么意思呢?可为空的,哎,那么如果这样的话,我就可以是不是给它传入一个了,传入一个nu,那么这样的话,传入一个这个常量的nu,那么它会解析成这是一个什么类型的流啊哦,Object类型,为什么说object?
07:47
题型呢,显然因为类型没有办法推断了,同学们是不是没有办法推断,因为这个那什么也没有。好,然后呢,这是一个STREAM3,哎三好,然后我们来终止一下这个这个流STREAM3,然后呢for stream,好,STREAM3,然后呢,终止它for each,然后呢方法引用set out,双冒号print LA,好,刚才代码我已经注释掉了,好,我们再来运行观察。
08:25
哎,什么也没有,什么也没有,那么也就是说这个呢,会不会引起空指针异常呢?啊,不会,其实他的做法非常的。是非常简单啊,哎,非常简单,在这里做进行了一个判断,哎,判断如果我们传入,那它会给我们返回一个什么empty,空的,哎,空的流这样,所以这样的话,我们去最终终止它的时候,没有任何的内容,好注意这是第一个方法是什么呢?Of noneable,它的作用是干什么?哎,可以传入一个now,然后呢,哎,来创建流对象,哎创建流对象好,这是ofum,好,那么这是第一个方法叫做of number,然后呢,还有就是哎就是什么呀,新加了一个方法,哎,我们在这里看到叫做take while和drop while,好注意这两个方法它非常的相似,Take什么意思啊。
09:31
Take,哎,拿拿到拿到啊保留while呢,哎,就像循环一样,也就是说while什么什么应该是个条件,Drop while呢,是不是也是条件啊,哎,那么我们说这个在这个例子当中,它是不是其实就是一个条件啊,好,我们来写代码来测试一下,首先我们得有一个哎流产生,哎有个流产生好,那么我们就可以直接使用刚才的哎刚才的代码产生的这个流,哎产生这个流,那么这个流我就以对其进一步进行操作,哎,那么添加的新方法是什么来着?哎,一个叫take while来take while,另外一个叫drop吧,Drop什么意思啊,丢弃在学数据库当中,学数据库的时候,我们经常用用到drop来丢弃,好来先测。
10:31
这第一个方法叫take while,好,Stream一点,Take while好,那么这里面需要一个predictdic,这是一个函数式接口,Predict是什么来着?哎,是一个判定器,判定器,什么是判定器啊,给我一个对象,然后呢,我对其进行判断,返回一个布尔,也就是真或假。那么显然在这里take while,如果条件为真的,哎,是不是就take出来?哎,为假的呢,就不要了。好,然后呢,我们看一下take while,然后呢,要写一个拉姆的表达式来传入一个参数,然后呢,这个参数要对其进行处理,最后返回一个布尔来返回布尔。那么我们就简单一点,比如我们就想要这里面的什么,哎,我再来个奇数,比如再来一个七,好,我想要这里面的奇数。
11:29
哎,奇数怎么做呀?哎,我想要这里面的奇数,那么哎,T如果是偶数,那么对二取为零,什么如果为零是不是就是偶数了?是不是哎为偶数了,那么我们不为零呢?哎,就是什么?哎,就是这个奇数了,所以在这里我们把这个take while方法去调用,然后呢,拿到的是一个新的流,新的流好这样的话,为了便于理解,我这把它保存一下,好注意就是STREAM2好,STREAM2好,然后呢,我们再来运一下,运行看一下这个啊STREAM2的它的一个内容啊,注意一定要终止它,stream2.foreach终止,然后呢,使用打印输出来,好,下面我们来运行看一下它是不是和我们预想的一样,哎跟我们预想的不一样,也就是说在这里它的动作是什么呢?我要取元素,取什么元素呢?只要你的。
12:45
元素对二取不为零为真的,我是不是都取取取取A取到20的时候呢,我们发现这个条件是变假了,哎,终止,所以即使你后面有偶数,有奇数,哎,对不起,停止了,所以它是一个一次性就停止了的,停止了的,所以它最终取出几个元素呢?取出两个来,第三个元素就这个条件已经变成甲,所以它就终止,哎终止,所以它的作用就是干什么呢?哎从流中一直获取什么,哎获取判定器,获取这个判定器为真的元素,直到什么。
13:31
啊,一直获取这个为为真的元素,一旦为假呢?啊一旦遇到元素为假,通通过判定期以后,结果结果为甲就终止了,哎,就终止处理好,这是这个take a while,那么我们说这个drop while是不是和它非常类似的,好来看一下,注意此时我们说STREAM1还能再用吗?
14:01
能不能再用啊,不能再用,为什么?因为它一旦硫一旦处理过,然而并且这已经终止了,这个硫就作废了,一次性使用,所以我要想在测试这个drop VI方法怎么办呢?哎,再重新生成好,我们可以选择把刚才的代码这哎复制一下,好,复制注意STREAM1,此时这是没问题的,一个新的流好然后呢,我们来还是调用它的方法叫drop wow里面需要一个判定器,好,那么这个判定器是一个哎波尔表达,那么它需要返回不尔值给一个对象,那么这个一样的,我们对二取于不为零,哎,不为零,好,那么不为零,然后呢,注意这也是产生一个新的流好,新的流这是一个STREAM3,好然后呢,我们对STREAM3进行一个。
15:02
迭代来进行一个迭代,好,那么我们来预测它究竟会发生什么事情,发生什么事情,Drop while。啊,也就是说,只要他为真。我是不是就给它丢弃啊,哎,给它丢弃好,我们来运行一下。好,那么运行的结果,注意在这里我们把它再来加一个分隔线,看不清楚,好加一个分割线,然后呢,我们再来运行。好,那么运行的结果是什么呀?22,二四十和七,诶,那么前面的三和九哪里去了呢?哎,三和九被drop了,Drop它如何工作的啊,也就是说只要你这个条件为真的情况下,我就不停的drop,丢弃,丢弃直到为甲,也就是这个20这为甲了,停止,哎停止了就不drop了,所以它保留下后面四个元素,好,那么这两个方法也是非常的直观,哎,非常直观的好,那么这是这个stream当中的,哎第二个改变的改进的一个知识点啊,那么还有一个最后一个是什么呢?啊,最后一个就是这个流的一个迭代方法的重载,那么硫的迭代它的作用是干什么呢?好,还是再写个新的测试,我们来看一下硫的一个迭代。
16:40
那么流的迭代主要用于好注意流的迭代,那么它主要用于产生流,创建流的来创建流,那么我们来之前我们是怎么做的呢?ER,那么iter它是一个什么呀?哎,它是一个迭代,迭代它需要第一需要两个参数,第一个叫什么seed t类型的一个对象,Seed CD什么?哎,是一个种子,或者我们认为它是一个基础元素,然后后面是什么?而后面叫做unerary operator,什么是unerary operator呢?UN operator就是单目运算符,单目运算符它的作用就是把第一个参数作为,呃,第一个对象作为参数,然后呢,把这个对象经过某种处理以后,产生一个新的相同类型的对象,哎,这个叫。
17:37
单运算,比如就像我们的I加加,I加加I是整数,加加完以后呢,它还是整数,这个叫单目运算,那么在这里通过这个给定一个值,然后呢,我在这个值的基础之上进行一个弹幕运算,然后产生一个新值,这样的话是不是就产生两个值了,然后呢,还没完,我在第二个数的基础之上再进行一个这个单目运算,然后产生第几个值啊,第三个,所以第一个值要经过这个单目运算,是不是产生第二个值啊,然后呢,第二个值再经过这个产生第三个,然后呢,再在第三个的基础上产生第四个,然后我们就发现这个流的产生有没有头啊,有没有结束啊,没有,所以我们把它称为无限流,哎无限流它里面的数据是无限的,所以哎,这个it方法产生的无限流,那么我们来个最简单的例子,比如我们的。
18:37
的基础值给定一个,给定一个什么呢?就是一,哎就是一,然后呢,它的单目运算,注意单目运算是一个一个参数的,然后呢,对意它进行是不是处理了,怎么处理呢?非常简单,二乘以T加一,哎加一,好,那么这样的话我会怎么做呀?哎,我在一的基础之上是不是进行乘二再加一呀,变成几呀,变成三,然后呢,再在三的基础之上再继续,所以这样的话,我们说这个产生的硫,它的一个效果是什么呢?哎,是一,哎是不是一系列的奇数有没有,有没有多少个啊,有没有我们能不能知道多少个呢?不能,因为它是无限流,所以像这种无限流,我们如果直接对其进行迭代,那么这个迭代有完没完呢?好,来运行一下,哎,它是没。
19:37
没了的。
我来说两句