00:00
那中间操作呢,我们就结束了,中间操作完以后,我们来看一下这个终止操作,那其实呢,我们刚才也用过这个终止操作,否则的话呢,我们也看不到刚才执行的这些效果,只不过呢,咱们目前用的都是for each,对,这就是一个终止操作了,那我们看一下除了for each之外呢,还有哪些这呢,首先提到一个叫匹配与查找。诶,CTRLC一下,这我们再去新建一个。Class stream的一个TEXT2。哎,这呢,我们来测试一下,哎,Stream它的一个终止操作。哎,终止操作这块呢,我们也是分成这样的三波,哎,这首先是第一波叫匹配与查找。好,这我们来写啊,匹配查找对应呢,我们有这样的一些操作啊,这是一波,然后呢下一页啊,这又一波,整个呢我就都放到下边了啊,要不往外粘的话呢,这个还挺费时间的,直接呢我就CTRLC一下啊拿过来。
01:05
哎,这呢,我们做一个这个测试啊,看到这些方法就有点儿不舒服了,就是吧啊。有的比较简单啊,就是你像我们刚才那会讲那个Fla map的时候啊,虽然就是一个方法,但是还得讲一会儿,这个像有的比较简单了,一看大家就懂了,反而那是比较容易啊,不能光看量是吧,先看第一个啊,说叫all match。说按照这样的一种,这叫断定型的,是不是大家都是处,都是处这个呢,就是all match的。啊,比如这有个这个练习。这练习说是否所有的员工的年龄都大于18岁,想想怎么写。咱们先把咱们这个员工拿到啊employee data.get一下employees,诶得到咱们具体的这个就叫employees吧,好,CTRLC过来。
02:00
首先,先死家。对吧,然后怎么办。这呢我就得到,呃,这样一个stream里边呢,其实操作的都是集合里边的一个一个的employee了啊,那这个时候呢,我其实直接可以考虑就用叫all,哎match了,All match里边咱们是一个断定型的传进来的就是一个employee,哎,我们现在呢,就是E啊,我看断判断它的这个刚才说叫什么年龄是吧,对概下他的A值,对你看是否呢,都大于18岁,这不就完事吗?是不是都大于18岁,所以它得到的是一个布尔类型。哎,这不有个bird类型吗?哎,我们就叫all match吧。再找他一下。那这呢是一个false,那是不是都大于18岁,是个force看一下。
03:00
啊,有12岁的啊,马云12岁是吧?嗯,其实马云呢,越越长其实越帅了,看着啊stream啊,这个名字写的有点不好,把这个名字改一下啊stream API。哎,这个保持一下一致。哎称哎完事了啊好,这呢就是判断一下它这个就不是真的啊,这个all match的话呢,就是所有的都是true,它才是个处行,这是这个下边一个啊这个安妮,安妮就是任一,只要有一个匹配就OK了,说这儿是否存在员工的工资大于1万,杨IG呢,就是只要有一个大于1万的就OK啊,那还是我们拿到employees.stream.any match。啊,这还是一对,然后呢,是一点一下大于1万,这就定了,这在这这个它老是显示这个啊,然我们这。
04:08
Any match,哎,这样呢,直接就可以了啊,只要有一个就行,看一下。还是false,那他们这个工资呢,待遇都比较低一些,哎这样啊行,这个你像今今年的整个这个就业形势呢,应该是不是特别乐观是吧?诶不管咱们说这个it行业了,It应该还算比较好的啊,其他整个这个行业里边呢,都不是特别乐观了,哎,包括这个咱们国家现在跟美国又在商谈是吧?呃,你会发现一个点,就是凡是这个动静特别大的,这个全世界都知道这个新闻,往往呢,其实没有什么具体事儿。呃,这个如果呢,谈的针对一些很实质性的问题啊,通常呢都新闻上呢,诶一行来说开了个会在哪开的,开完了是吧?哎,那这种会往往是谈的事儿都比较大啊,诶中国跟美国现在已经开了好几次会了,而且对外呢,其实就没说任何的消息啊,哎,都在谈这个大的方向上啊,确实是,呃,对中国来讲是一个。
05:06
谈不上说生死攸关吧,但是应该是绝对影响到后续这个几年十几年到几十年的这样一个发展的一个战略方针啊。啊,美国呢,这个一定一定程度上还是要打压中国的啊,这很显然的,所以今年来讲,不管是中国来讲,还是这个从全世界范围来讲,这个经济形势都不是特别好啊,这个你像有的这个it公司现在就做什么事呢?嗯,就像华为学习华为怎么做呢,华为一般都是,哎,招一个人啊,干三个人的活,开两个人的钱。是吧,啊,就这种是吧,好,咱就先不研究那个问题了啊,呃,但是呢,只要你学的好了,这个永远你不用担心,说it这块呢,说不招人了,这个绝对不会的啊,你要是有一些行业,比如制造业啊,你可能这个这个这个手法很好是吧,但是呢,可能就就失业了啊,因为已经不需要这样的人了啊,我也不不卖东西到美国了是吧,这个人就是失业了,你就得干别的啊,但it这块还不是一样啊,只要大家这个技术还可以的啊,这块人找个工作是一点问题没有啊,但是咱肯定希望说找的这个尽量的好一些是吧。
06:13
啊,所以呢,每当你这会儿我看有同学还在那这个来的时候在那看小说呢,在哪啊,你看小说的时候,你想一想,你后边你打算干啥啊,就就就就就别在这为了一时的爽快是吧,嗯,然后后边呢,就一直就不爽了,就啊好。嗯,那接着啊,接着我们再看后边这个,这个呢叫nu,哎,Match nu match呢就是没有一个匹配的啊,说是否没有匹配的元素啊,就这个意思,那还是拿我们这个叫employees点啊先呢叫stream啊,接着呢叫none match啊这里边练习说是否存在员工的姓叫雷,对雷军啊,姓雷,那这块我们还是这个员工,呃,e.get他的name幕点contain了。
07:03
还包含了啊对,行,那那那就复杂一点了,那你还得获取它start with是吧,其他位置也行。大。Starts with啊,这呢,我们写一个雷。位就是以这个开头的,呃,中文,呃这个中国人的话不都是姓写前面吗?呃,这块的话我们就可结束一下。然后获取它的一个值那。Match,那这个你要注意啊,他说检查是否没有脾胃的元素,它可不是说检查是否有,那你比如说咱们这里边要是有性雷的,你说这返回啥对,返回就是false了。那是不是没有姓雷的啊,那要有的话呢,不就是false了,咱们这里边看一下,这返回是个false啊,那因为我们这里边有雷军在是吧,雷军在啊行,那这呢,就是我们说的这个叫no match,那再接着下边涉及到这个find first find any啊再来看这呢,就是查找第一个元素,查找第一个元素那我们就employees。
08:20
啊点先stream一下,拿到它的第一个元素,这个呢,你可以在之前呢,加一些其他的中间操作,比如说我们所谓的这个排序啥的啊,但是这时候你要排序,咱们没有实现comparable,你得还得用这个compar来做了,诶稍微来讲就比较麻烦一些啊。那我这块呢,我就不写这个sorted了,那咱们就单纯的来测一下这个叫饭的first。哎,拿到第一个元素啊,第一个元素的话呢,我们直接al enter,诶返回的那不就是一个普通员工嘛,诶这个大家注意一下,返回的这个类型呢,叫optional。这个optional呢,咱们讲完stringpi以后呢,咱们说一下这个类,哎,这个类的话呢,它具有一个特点就是说呃,它首先也是个容器了啊,就是我们来处理控制人问题的时候用它,那暂时的话呢,咱们先不过多的在这儿去讲它啊,我就直接呢放在这儿啊,其实是一个optional类型的啊。
09:15
直行,哎出来了,哎通过这呢,我们也能看到里边呢,确实存在的啊,这个我们第一个元素就是1001。啊,就是因为我们这个绿色里边放的第一个是它,诶大家呢,也可以下来呢,自己演示的时候呢,呃,你在我们的这个。哎,在我们这个find first之前啊,你也可以去调一下,比如说叫how的方法,排完序以后你再找第一个,那言外之意呢,你要是升序再找第一个,那第一个就是最小的。哎,就这意思行,下面一个呢叫find any,哎,我们还是employees,哎,点stream啊接着find any,这呢就找任意一个。奥特。Employee employee,看一下。
10:07
那此时呢,诶看是马化腾第一个是吧,那在执行还是马化腾,那在执行还是马化腾啊对这个原因呢,其实跟我们用的这个stream有关系,这个时候咱们一直掉的都是这个stream的方法,这个我们说了,这个集合中除了这个stream之外呢,它还有另外一个啊,Parallly stream。哎,这个呢,获取的叫一个并行流啊,就是刚才呢调STEM是一个串行流了啊,或者叫顺序流,顺序流里边发它其实老师从第一个去取,那我们这个并行以后呢,你看看。那就比尔盖茨了。比尔盖茨没有变化了。比尔盖茨是第。在这个是吧。啊,这个大家运行的话呢,跟我这个就不会一样了啊,诶确实是它了是吧。
11:03
那他有它吧,哎,就这块呢,就取了个并行流,然后呢,哎,Find any就是它取任意的一个操作了啊行,然后再接着呢,这个叫count count呢叫求个数啊这块也不少了,咱们把这个呢拿出来,咱们再专门的写一个方法测试啊上面已经有点多了。行,那接着来看第一个,第一个呢,就要求个数,嗯,求个数来我们写一下啊,嗯,首先我们比如还用咱们这个集合,员工CTRLC得到这样的一个集合,哎,然后拿着它呢,我们去操作啊,Employees点,诶先stream一下,哎接着的话呢,我们去求他的一个count count之前呢,你也可以做一个filter,做一个过滤,诶过滤的话呢,我们先查一下这个,比如说员工,诶这个员工的这个工资啊,Get一个salary大于5000的人的个数。
12:00
呃,先过滤完以后返回的仍然是诶employee构成的一个,呃,这个stream了啊,然后在这个基础之上,我们再去点一个count,呃,也是说呢,这个中间操作呢,大家啊,当然这个中间操作就这一个哈。啊,你也可以呢,再做很多其他的这个中间操作啊,最后呢,得出来一个,哎教一下我们这个终止操作啊叫count,诶这个我们输出一下这个count,注意我们这个count呢,它访问的类型是个long啊,哎,像我们在这个数据库中,大家回头讲的时候呢,诶如果我们想计算一下说数据库中这个表中有多少条记录呢?哎,你会发现它返回值也是个浪。啊,因为有可能流数据量特别大啊,超出了我们英特尔的范围。那这呢是五那一级呢,就是我们大于5000呢,一共是五个人,那你可以在这数一下啊,五千一个两个345。就这五个啊行,再接着这个呢叫max,这个呢叫min啊for each,咱们呢,上面已经都用过了啊,先看下第一个叫max球叶最大值。
13:01
啊,求最大值,这个呢有一个comp。对,就按照这种比较这种原则啊,求最大最小,那前提呢,你得能比较才行啊,所以我们这块呢,怎么比可以按照这种原则呢,进行一个比较这块呢,要求说返回最高的工资。返回最高的工资,那就是按照这个排序找那个那个,比如是个升序排,那就是最后一个,它就是最大的了,最高的工资来看一下怎么写啊。Employs点。然后呢?然后直接max啊,直接max里边呢,那你就得是拿着这个员工去操作了,其实我也可以先map一下,诶左边呢,放的是我们一个一个的employee,我映射完以后,我只取他们的工资。也可以的,对吧,所以map这块呢,我们拿到的这是一个员工,然后呢,我就1.get他们的salary,诶这样诶这样呢,你要是怕呢,不熟悉,我们可以先让他返回一下,此时呢,拿到都是我们这个money啊,诶或者叫salary。
14:14
哎,构成的一个stream了,行,那拿到这个salary这个stream以后,我们其实想取它这里边的这个最大值了。诶,它这里边你注意我们是一个double类型,Double本身是不是实现那个compable了,嗯,Double,那我们这块呢,你看我要调一个max,诶那他这块还必须让我写一个得是吧,写的话呢,去compar comparson的话呢,呃,需要呢,你去传两个参数,然后呢给我们再去,哎,返回一个一证型的值,那其实呢,我就用一个。Double compare。Compare compare俩参数的,那用compare得搞定。哎,这呢,又相当于用咱们这个方法的引用了啊,哎,通过这个这个静态方法,哎用的是咱们,哎这里边提的这个第二种情况。
15:09
啊行,那这个写法不唯一啊,因为大家不一定非得按照我这种写法来,那max以后这呢,我们就得到这个最大的这个叫什么叫salary了啊我们一下。哎,这就得到最大的一个这个工资。行,这时候呢,我们发现它返回仍然是一个optional这样的一个类型的,咱们暂时呢,先嗯不关注于这个类型,一会儿咱们再具体说它啊好,这块我就做一个输出。啊,9876啊,这个呢,确实它是最高的啊。年纪轻轻就挣那么多是吧。行哎,回过来这呢是我们求的这个max了,然后接下来我们看这个min啊,Min的话呢,也是按照这种规则去比,这呢就要返回最呃最低工资的员工,注意这俩需求不一样。
16:04
这呢,叫返回最高的工资。这呢就是返回工资最低的员工没要工资,我要的是员工需要你给我打印这个员工的信息。那这块你就别别map了是吧,Map呢就成了这个公司了啊,那这块呢,我们看一下,首先employees点怎么着呢,Stream哎,Stream呢,我们需要呢,去求它们的min。哎me呢,这里边我们先放的呢,都是具体的一个一一啊一个一二,哎这个好几个这个员工了,比较呢,他们这个叫工资工资,嗯,咱们这里边再去调的话呢,还得是double是吧。呃,返回一一的工资,然后一二的工资,那我们就是double点,哎,Compare,对,然后一一.get一下它的salary,哎,一二.get一下这个salary,哎,这样这不就搞定了吗。
17:04
对,这不就是员工吗?嗯,这个呢,就是我们的employee,就我这没做没做映射哈,做映射的话呢,上面我是映射到这个钱这块了,所以得到的是关于这个诶钱构成的一个stream这块,我没映射,直接呢,就拿到我们这个员工啊做的一个面操作啊这呢就是按照这样算是一个升序排了,那升序里边呢,左边这个呢,就是按照生序排完以后,左边这个自然而然的就是M啊。打印一下employee,好,工资最低的员工。扎克伯格啊,35岁了,两千五是吧?啊行,这呢,就我们说的这个,诶最大最小这样的问题,下一个呢叫for each啊这个呢,其实是最不用去描述的了,哎这咱们这个上边呢,哎为了演示中间操作,哎咱们基本上都是用的这个for each做一个终止来进行执行的啊哎employees第哎stream第诶for each,哎不做任何的中间操作,直接呢就便利一下,就这样来写,哎这块呢,因为一个消费者呢,我们又可以拿哎这个print stream里边这样个方法呢去替换啊这就是个便利。
18:21
你看这样执行一下。行啊,这个就是一个便利了,这个呢比较简单啊,那我们把这种便利方式呢,叫做内部迭代,内部迭代就是通过我们这个呃,Stream呢,直接调的这个forage方法进行了一个迭代操作啊,那一方面呢,你看我们这是一个stream调的,咱们在之前讲课的时候呢,其实用过我们这个employees。Employees,这不是一个集合吗?直接呢,它是不是也有一个for each啊?哎,他的这个for呢,也可以直接大家这样去写。诶这块呢,也是一个便利啊,诶这个便利你注意跟我们上边这个便利虽然都要for,但是它这个主体不一样啊。
19:04
上面呢是我们这个stream里的啊,一个终止操作,这呢是咱们这个集合里边的一个普通的方法啊,当然了,这个方法也一定是一个default的。啊default啊啊,一个默认方法了,行,这呢相当于是使用。哎,集合的啊,一个便利操作啊。成,哎这个呢就叫做内部迭代了,那咱们之前呢,使用这个以T的那种方式,那咱们呢,对应的就称为叫外部迭代了。啊,就叫外部迭代了啊,什么叫外部迭代,就是你这是一个一个list,然后我们外部呢,拿到一个指针啊,一点点一点点这样去迭代,什么内部迭代呢,你可以理解为就是它后边呢,自动的就往下移,往下移往下移这样啊内部迭代啊。行,那这呢是我们说关于这个第一波啊,叫做查找啊与匹配啊这样的操作。
我来说两句