00:00
接着的话呢,咱们来讲一下这个第13章叫做泛型,这呢是一个新特性,那按说的话呢,我们讲完,然后呢,在开发当中的集合的使用之后呢,该讲讲它的底层实现了啊,中间呢穿插一个泛型啊,这块呢,是我们在实际开发当中啊发现呢,在这个集合当啊都使用了泛型这样一个特性,所以呢,我们穿插一下,哎,这中间呢讲这样的一个新特性,所以这章的内容呢不算多,诶就这样的几个知识点。啊,这个我们通过这个思维导图的角度来看一看也行啊,主要呢,我们就讲这样几个事儿啊,第一个的话呢,就是我们机核当中使用的泛型,那我们呢,接下来在写代码的时候呢,就应该在集合当中呢用上泛型了,所以呢,我们第一个问题呢,就是在集合当中去使用泛型啊,包括呢,还有其他的像比较细。Comparable compar,他也声明了泛型,所以呢,以后我们用的话呢,也给大家用上泛型。这呢是我们的第一个事儿啊,然后第二个事儿的话呢,除了呢,我们现有的一些API当中啊,它声明的时候呢,已经有泛型了,咱们呢也可以呢,去自定义,比如说反型类呀,泛型接口啊反映方法呀,是吧,可以呢,像哎comparable也好,或者我们这个release也好,哎跟他一样。
01:08
他能咋做,我们也能咋做,哎在需要这些场合呢,咱们还可以呢,去自定义,这呢是第二个事儿,然后第三个事儿呢,就有了这个范星以后啊,我们看看在这个技能方面呢,它的一个影响。啊是什么样子的,所以说我们这儿呢,讲个小知识点,就是泛型呢,在技术上的一个体现。然后由这个引发出来的,我们要讲一个符号,这个符号呢叫做通配符,哎,所以呢,我们就在谈谈这个通配符的一个使用。通配符呢就长这样,但是呢有两种啊,有限制条件的通配符,这呢也是个难点,把这个呢说一下就可以了。所以呢,诶这一章的内容啊,相对来说就比较少一些啊,那要说这个重点在哪儿呢。毫无疑问,应该是在第一个问题上。那这一周呢,如何去自定义泛型类泛型方法,这个我们也讲,但是大家呢,可能有啊,比较长的一段时间呢,可能都用不着。啊,在有些场景下呢,我们才会去用,所以这个使用的频率呢,并不算高啊,我们也讲一讲,如果呢,后边你忘了,哎不行呢,再回来看一下,其实就行啊,其实这块定义呢,也不复杂啊,然后这块呢,是作为两个知识点出现的。
02:10
啊,所以呢,相应的这个代码的话也有,但是呢,呃,不是那么多了,就啊,所以主要的话呢,还是第一个问题。好,那么说这个内容啊之前咱们首先得说清楚啊,范型到底是什么啊。这个从那个名字上来看的话呢,我们其实呃很难,呃,对于这个名字呢,有一些剖析了,不像我们说呢,叫类的继承性啊,一说继承我们就比较形象的知道是什么意思啊。这个泛型的话呢,所以我们还是得举生活中的例子呢,便于去理解。比如说呢,我们去这个中药店啊,中药店的话呢,你看有的很多的这种小盒子啊,每一个盒子上面呢,它都标识了,你这个里边呢,放的这个药材是什么。那么我说呀,就是写的这样一个标识,就相当于呢,是我们代码当中的泛型。啊,那再具体一点,这一个盒子呢,也是个容器,这个容器的话呢,假设就是我们的一个集合了,那我们在这个集合上面加了个标签,比如像这个呢,这叫旋身是吧,里边呢,只能放这个玄参,不能放别的,放别的就哎相当于咱们编译系呢,比如就报错了。
03:12
啊,这就相当于呢来限制啊,咱们往集合中添加数据的类型,那么所谓这个限制的这个类型呢,其实就是泛型的例子了。啊,那比如说你去这个药店里面去拿药的时候呢,如果上面都没有这些标识。那你得点胆战心惊了是吧?那万一抓到这药呢,不太靠谱怎么办呢?诶,所以呢,这块呢,通常都会有标识啊,通过标识呢,我就知道呢,里边就是这个东西。OK啊好,那我们去超市也是一样,超市的话呢,你看这有好多的这种酒水啊,那具体哪种酒是什么啊,这个呢,你不能靠看了,哎,你得看他这个标签。那看到这个上面贴的这个标签才行,那这个酒上的那种标签啊,也相当于我们现在要讲的那个泛型。OK啊,那在厨房当中也一样,这呢是一些容器啊,这里边儿的装的到底是什么?诶,我们也上面加个标签。
04:02
那就这样个情况。嗯,还比如说咱们这个,嗯,上海这块应该是咱们国内呢,算是先行的哈,就是这个垃圾桶。是吧,哎垃圾分类哈,然后呢,这个诶分了好几种。啊,这个这个有的是这个可回收的呀,以前呢,就是可回收不可回收啊,现在有这个干湿的一个分别了。啊,好几种啊,只不过大家扔的时候好像有的也不太注意是吧。啊,那么这个原来的这个垃圾桶的话呢,就是没有分别,大家随便扔。啊,这如果看成容器的话呢,就好比我们的集合啊,At的时候呢,任何的啊object类型,它的这个对象呢,都可以往里边放。说现代话不行,这样不好,那我们这块呢,给这个垃圾桶上面就加上这种标签了,说呢,诶你只能是这个干垃圾啊,这个这种湿垃圾是吧?诶或者这种可回收的加了个标签,那这时候你再往里扔的时候呢。哎,你就可以怎么着呢,按照这个要求来是吧。哎,那不是这个类型的,就不要往里边放了,这个呢,就相当于是我们的泛型啊。
05:02
好,那么我们再来看一下啊,从我们这个程序的角度,我们去引入一下。哎,你像咱们以前的定义方法的时候哈,说如果呢,在这个方法内部呢,出现了一些不确定性的一些数据了,咱们呢,就以行参的方式呢去体现。啊,然后呢,你再调这个方法的时候呢,传入具体的食材。这里边儿注意不确定的是这个变量的值。关于这个变量的类型呢,其实算是确定的。呃,受这样的一个想法的启发,那我们呢,就引入了一个叫做类型的一个参数。注意你看这个参数呢,是类型参数压呢,这个参数在赋值的时候呢,它赋的是一个类型。就像我们刚才说的啊,你这个里边装的是啊什么东西是吧,比如我们这块呢,这个集合装的是。啊,那这个死顿呢,就作为我们这个泛型的一个,呃,具体的食餐传递给我们这个标签,这个标签呢,就我们说的一个泛型了啊。OK,就是这样的场景,这呢,我们是在5.0的时候引入的这个泛型的这样一个结构啊,这叫参数化类型。
06:05
啊,就相当于这个参数,它实际上是拿一个具体的类型来进行一个赋值,比如说呢,啊,我们这块呢,写个list后边这个监括号,监括号里边呢写的是string啊那就表示呢,我们这个list里边呢,只能够用来保存字符串类型的对象。啊,就这样的场景,那除了我们这个像以例测为例哈,除了呢,它这个类型这块呢,我们可以去变化之外呢,你会发现呢,我们在例测里边讲过增删改查差。长度变力是吧,这样的一些方法,那其实呢,除了类型这块呢,我们呃不确定之外呢,其他的这个部分呢,都是确定的。就是我们添加,那就加进去呗,查询,嗯,给角标我就给你返回,其他这个方法呢,其实都是确定的。哎,所以呢,我们这块呢,不需要呢,定义不同的例子,咱们只需要呢,是同一个例子呢,体现的就是它处理的类型不一样而已,所以我们只需要加一个哎这个所谓的参数就可以,这个监块里边呢,写的这种参数呢,其实就这种叫泛型。哎,就这个意思啊,包括呢,我们讲这个comparable,讲这个competitor,我们真正看底层源码的时候呢,你会发现呢,这两个接口后边呢,也带了一个监控号。
07:09
这个铅块呢,其实就是我们说的泛型的意思了。啊,它里边写个T,第二呢就是诶我们呢,具体比较的是哪一个类型啊这块呢,我们就不用呢,每次都写成object,一进去先判断一下,说呃哦是不是inno谁谁谁挺麻烦的,诶我们这呢,用了发型以后回头呢,我们在调用这个结构的时候呢,直接就指明它是哪个类型就可以了。不是这个类型的呢,他都根本都比不了。哎,就更方便一些啊,那么我们刚才提到的这样的一个结构呢,就是反形的意思。下边就有具体的这个例子来去举了,哎,这个例子举的话呢,我们做一个对比,比如说在集合当中,我们使用泛型之前是什么样子的,使用泛型之后是什么样。是啊,这样个情况,然后这块呢,是对这个型的一个整体的描述啊成C咱们把这个描述呢,诶到我们这个泛型这块,呃,第一个打开啊,刚才呢,说了这么多。
08:03
哎,我们看在这个集合中使用,哎使用的话呢,它其实呢,就是有关于泛型的一个具体体现了,那这个体现是怎么说的啊说呢所谓的泛型。就是允许在另一类或者接口的时候,通过一个标识来表示类当中的某个属性的类型。或者是某个方法的返回值或参数的类型,这个参数就是行参了。表示的是类型,注意啊,这个类型参数啊,将在使用的时候。啊,什么时候使用呢?比如说我们去继承或者实现这个接口。啊,或者是创建我们这个,哎泛型类的这个对象,或者我们去调用方法的时候呢,哎,你这块呢,需要指明具体这个参数的类型啊,这个时候呢,我们去确定下来,一旦确定以后呢,凡是用这个泛型参数的这个位置啊,都是你确定的这个类型。哎,这样一说呢,还是有点抽象,那下边呢,我们就来给大家呢去举例子了啊,那举例子的话呢,我们比较方便呢,就是拿集合来说,因为呢在JDK5.0的时候啊,你看这里边写到了。
09:03
在这5.0的时候呢,我们引入了泛形了,一旦这块引入以后,5.0呢,就把咱们整个集合框架当中涉及到的这种接口啊类啊,全部都泛形化了。啊,包括呢,我们的comparable compor,还有呢,后边这个叫class这个类都是如此的,诶你看啊,我们回过来CTRLN一下,比如说咱们这块呢,你看一下这个叫。Collection。好,这块我们来看一下它这个源码啊,诶看这个版本都行,进来之后呢,你会发现呢,它都带上这个监括号了,这就是泛型的意思了,在GP5.0之前呢,都没有,哎,5.0引入发应以后呢,就全部都加上了,哎这个我们看一个具体的实现类也行啊,比如说叫LV。At least。哎,这个我们进来啊,点开那这块呢,诶跑到这来了啊。哎,这让看都有,所以呢,哎,对于俄类来讲,因为它是个类嘛,这就叫做泛行类。啊,那这个呢,因为它是个接口,它也叫做泛型接口。
10:02
OK啊行,那至于说什么叫泛型方法,这个我们讲到这儿呢,再说啊好,那么加上泛型了,发现呢,我们在第12章的时候呢,根本也没有用泛刑。发现呢,也没有报错。啊,这呢是合理的,毕竟呢,是不是要向下兼容啊。啊,因为咱们JDK啊,或者我们叫Java也行,这个5.0之前的时候呢,都没有用泛型,我们呢写了一些代码,现在5.0呢,你都加上泛型了,你不能加上泛型之后呢,诶我们导致原来的代码都报错了,那不行。哎,那其实呢,之前的代码不加泛型也行,也就是呢,我们声明的这叫泛型接口,泛型类,我们真正用的时候不用可不可以呢,可以。哎,但是呢,建议你用,为啥呢?哎举例子啊。说呢,我们在这个集合当中使用泛型之前的场景,咱们前面其实全都是啊,咱们只是呢再写一个例子。比如说现在呢,我们想把啊学生的成绩呢,放到这个a release当中了啊,我们就拗一个A啊,当然了,先得写个单元测试方法啊。
11:05
好,过来这个呢,我就直接out加回车。嗯。什么情况?奥特加回车啊,在这儿啊。这个就直接这样OK了啊好,这块我们又一个二。哎,我就生分成例子了。哎,这么着了,然后呢,我把学生的成绩呢,添加到咱们这个例子当中,那此时的话呢,它只能是放object了。这呢,咱们就自动装箱了,我就放几个学生的成绩。诶好了,那么由于的话呢,我们此时的添加的时候呢,他认为是object类型的都可以往里放,所以呢,我就有可能是不是混入一些非integer类型的数据了。比如说这块呢,我就点I的时候呢,我就写了个A,其实这个事儿呢,就不太靠谱。是吧,这个呢,其实就是我们想要强调的第一个问题啊,把它称为呢,叫做类型不安全啊。
12:00
哎,问题一。哎,另一不安全,具体描述的话呢,就是哎,因为爱的方法,它的这个哎参数呢是。哦,不,这个类型。啊,那就意味着。啊,任何啊类型的这个对象啊,都可以添加成功。哎,就成这样了,但是我们在这个具体问题当中啊,我们就只想放学生的成绩,你却没有给我们提示他不对。这呢就是不太安全啊,这是第一个问题了,好,那么咱们先把它先注释一下啊,添加完以后的话呢,我们在另外的一个场合当中,就想把这个数据呢给它取出来,然后呢,我们去做一些操作了,取出来的话呢,就是一个便利了,比如我这块就使用这个叫迭代器。哎,替代器啊,还外循环。Has next。哎,在这呢,我们就先取出来啊,要这个ne方法好,取出来以后的话呢,他认为呢是object,但是我们接下来呢,就像以前我们做过这个题啊,我们想取出最高分,然后看着每一个成绩呢,跟最高分之间的一个差值,这块呢,其实就比较一下成绩之间的这个。
13:10
差距是多少了,我们就要做这个加减乘除的操作了,言外之意呢,就我们有必要呢,把它们拆出来,露出来是一个数是吧?所以呢,你可以考虑呢,就先,哎,我们这个用integer。啊,比如我这块呢,就是用个I来表示了啊,接着做一个强转。哎,想调完以后的话呢,接着啊,你说呢,他就是这个成绩了,哎,然后呢,我们再可以呢,叫拆箱一下是吧。哎,自动拆箱了,这就可以了。好,然后呢,接下来你再去比较啊,说谁大谁小,哎差多少分是吧,等等啊这块咱们就简单的点啊,我就先呢去打印一下了。OK啊。啊,石膏。行,然后呢,目前的话呢,我们只放了这四个成绩,我们呢去做一个run这块打印的话呢,也不会有什么问题,那这张就都出来了。哎,但是呢,由于我们上面这个位置啊,咱们可能呢,会混入这个非特类型的这个数据,所以导致我们这块在做强转的时候呢,就冒着一个风险。
14:10
就会出现了这个叫类型转换的异常是吧,这个题目呢,我们在执行的时候确实还出这个问题了。哎,前几个没问题,到后边这块呢出了,因为string呢不能够转换成。哎,出错了啊,哎,所以呢,我们这儿呢,也算是有一个问题。这个问题的话呢,怎么描述呢,最起码来说,哎。我们这块呢,需要进行类型的一个转换,就是需要使用强转化。啊,就是不管你这块呢,有没有问题,都得强转。啊,强转这个操作首先呢是反琐。啊,其次的话呢,我们说还有可能。还有可能哎,导致咱们说的叫哎class。Cast。啊。
15:01
啊,这样的一个异常信息。这是我们不希望看到的啊,那么目前这个题目的话呢,如果有这个数据导致这块呢,就也出问题了。这呢就是我们在使用泛型之前的这样的一种场景,因为在实际问题当中啊,咱们不会说像咱们前面写这个案例的时候呢,整一个字符串,整一个数值,整一个date,整一个啥的,其实我们真正在用这个list去存的时候呢,大家会发现基本上咱们存的是不是都是同一种类型的呀。不会说呢,这混乱的一起的啊,行,所以呢,我们既然都是同一种类型啊,现在你没有任何的限制,不太合适。哎,那下边我们就得考虑使用上泛型是不是会更好一些呢?诶,我们就还拿这个例子来说,我们看用上泛型得怎么着。好,那从一开始的话呢,我们就可以去使用,我们之所以能够在list或者list当中去使用,就是因为人家在声明这个类的时候,或者声明这个接口的时候呢,它就已经是有泛型了。啊,如果要是没有的话呢,你也不能用啊。
16:00
这个注意一下好,然后呢,既然已经有了,那么回过来咱们就可以呢去使用了。这个找到这个代码啊,哎,在这块去写,那我们就这样啊,嗯,比如说前面呢,我这块还是用list吧,这个建号里边指明啊,你这块呢,处理的类型,咱说呢只能是inte。好,这个还叫例这边呢,我们去扭一个。啊,AA。这么着,然后呢,在这里边儿呢,我们也说明呢,这是一个。哎,这个就这样的去用啊,大家先了解一下啊,咱们就先举个例子,好,这个有了以后呢,大家你再看啊,我通过这个例子呢,我去ADD的时候,你会发现呢,此时呢,我们在添加它只让添加体了。非就进不来了。当然我这样写的话呢,还是自动装箱了就。哎,我就复制几个。诶,你看没有问题啊,当试图去添加非类型的对象的时候,比如说A这个时候呢,直接就编译给我们报错了。
17:01
因为呢,你不是类型的,哎,所以通过这个角度呢,我们就解决了第一个问题。啊,就是编译报错啊,就能够保证类型的安全。这样没问题,好,那因为呢,一开始呢,你就没有添加进非特类型的数据了,所以呢,使得我们后期在取数据的时候呢,也就。更方便了。因为我知道里边呢,就是阴是吧,所以这块我们比如说也用这个迭代器去取啊,大家你看一下啊,我这个list的点。哎,我调这个叫这个方法的时候,哎,你看它的反回值类型。像这样是吧。诶,然后这块我们alt加个回车,诶走起。你看他呢,竟然也有反星,是因为呢,他在声明的时候呢,你看他就带着呢。呃,原来没有用的时候呢,没发现,一用的时候发现呢,全都是反型是吧。哎,然后呢,接下来还是这个while循环啊,点我们叫has next,然后呢,在这里边啊,点我们调这个next方法,这个调next方法的时候呢,你看一下啊,点next它的反回质类型。
18:05
哎,就是我们这个。哎奥价格回撤,哎这呢,就我们说的这个叫成绩了是吧。哎,这个我们就先写成I吧,然后下边这块呢,按照我们上面这逻辑,咱们再给它做一个自动的拆箱。哎,这样就可以了,好这块呢,我们再做一个,比如说打印就行啊,好,那么在这个位置的话呢,我们就避免了强转。哎说呢,因为添加的,哎都是呃in类型。那就避免了。啊,强转操作。OK啊,那上面这块我们还得需要做这个强转,因为呢,他认为你是object这块就不用了啊,直接呢就避免了,诶所以呢,我们这块呢,写起来也更方便一些。来,我们把这个呢走一下。看一看,没有问题。啊,这就成了啊行,那么我们这里边呢,稍微得解释一下,诶说为什么我们这块呢,去声明一个enter,然后这块I的方法,包括我们这个叫特这个方法呢,它这块都是指定为节类型的呢,哎,其实是这样子的哈,这呢我们看list也型看这个list呢也可以啊,如果你要看list的话呢,你就看这了。
19:13
呃,由于我们在声明的时候。哎,我们这呢是一个E,这个呢,有了E之后呢,我们在下边这个方法当中啊,我就可以使用这个一了,比如说咱们刚才看到一个叫爱的方法。就它了啊哎,这个I的方法的话呢,你会发现呢,它的这个方法的这个行参呢,就是个E,一旦呢,当我们在造对象的时候,指明这个E,它这就是泛型参数了啊,我们用去替换的。这个一旦指明以后呢,凡是呢,在方法或者属性当中使用这个发型参数的地方。都会替换成你指定的这个类型,所以呢,我们这个呢,就变成了。啊,这是它,然后呢,我们刚才呢,CONTROLT12,咱们还调这个叫eer这个方法了,这个方法的话呢,你看我们调的时候呢,它的这个返回值类型这个呢叫这呢也带了个E,那因为我们这呢叫enter,所以呢它这块呢也是enter。
20:06
所以呢,回过来咱们在调这个方法的时候呢,返回值这块呢,你看它就也是引进值了。啊,是这样的原因,好,那么integer这块呢,我们进去它这块呢,因为是个integer的。所以呢,你看它里边的这个ne的方法的返回值这块呢。也是这个E,你使用这E了,所以呢,这是特尔的话呢,它就也是尔。哎,就是这样的一个原因,那么之前呢,咱们从来没有使用这个发型的时候呢,诶,那么他就认为呢,相当于我们就是object了,所以呢,诶我们原来说呢,就大家就忽略这个事儿就行啊,见到E的话,你就当成object,当时我也说过这个事儿,也就相当于我们在泛型类或者泛型结果当中,如果你要不使用这个泛型的话呢,就看作呢是object了。诶就这个道理啊行,那通过这个例子的话呢,我们就,诶相当于呢,了解了一些相关的一些信息,好这块呢,稍微做个总结啊说呢,在机合当中使用发行之前可能存在的问题,诶刚才我们就提到了有两个问题,这呢是第一个问题。
21:03
哎,这个我们把它诶占过来,诶第二问题,哎,这呢我们得强转,强转呢就有可能有风险。啊,这是他。好,那呢,在集合比较系当中使用泛型,这是个重点,咱们呢,就直接说呢,就建哎代码就可以了。好,那么刚才呢,咱们举了一个例子,它呢是在这个a list当中使用的一个场景啊,简单的我们举了例子,那我们说呢,在实际开发当中啊,除了a list之外呢,还有一个呢,是叫map比较常用,所以下边呢,咱们再举一个啊说呢叫泛型在map中。哎,使用的这个例子。啊is啊,这个为什么要单独再说一下map呢?因为我们这个map呢,它跟我们上边这个还有点儿区别啊,你看我CTRLN咱们看一下呢,哈希map。啊进来诶哈ma呢,因为它存储的是一对一对的数据,所以呢,你会发现呢,它这里边声明的时候呢,它又带两个反行参数了。
22:05
这个往上是吧,你看这里边儿就有俩,那一个叫KK呢其实就对应我们K的它的一个类型叫VV,就是我们Y6的一个类型。哎,所以你看它这里边儿有两个哈,这样有两个的话呢,你也能够想得到啊,我们在CTRL f12,咱们看下这个put方法。哎,那么这时候呢,你发现呢,它是不是就成这样了。诶,类型的一个啊,V类型的一个value。哎,就这样好回过来,那我们这块呢,比如说演示一下啊,哈希map的一个使用,那我就new一个叫哎哈希map。啊,先这么着啊,前面呢,我们叫哎哈希map map这么着,这是以前的写法,现在呢,我们在这儿呢,得讲减括号了。比如我们这个键呢,是string类型的,值呢是类型的。哎,我就这样来写了,然后后边这块呢,我们也给它整上啊,这呢是string类型的,这呢是呃in t类型的,哎,就这样了。啊,没问题啊行,这个呢,你看我写的时候啊,这呢以它为例是这样子的,然后release为例是这样子的,你会发现呢,我们这是什么类型,这呢是不是也是什么类型。
23:08
诶,所以这块呢,我们,呃,其实呢,在写的时候呢,还可以这样去写。诶,我直接呢,就把后边这个呢,就给它删了啊。把这个注释一下,你发现了,你看也不报错。哎,注意这个建号呢,不要省,它还是要有的,只是说里边这个内容呢,不需要写了,这个我们看到呢,叫做类型的一个推断了,就相当于呢,就是我推断出来你就是跟这个类型是一样的。啊,这呢,你说稍微注意一下,这是咱们这个啊,叫JDK7的一个新车型啊。啊,也就是说呢,我们从JDK7的时候呢,你才可以去这样去使用啊。这是一个小的知识点啊。好,那这块我们有了这个map以后呢,接下来诶我们呢,就可以通过map点我去调这个put方法了,这个时候呢,我们这个key和value呢,就指定为我们指明的这个类型了,所以呢,K呢是string指呢是value。
24:03
比如这个是汤姆。这个我们来一个假设,还是成绩哈。接着呢,我们在map点,诶铺一下。Jerry,是吧?这个87。哎,一下。这个。肉丝。九九是吧,哎,行了,我就放这三个数了啊,那这个呢就放进去了,然后呢,下边呢,我们演示一下比较难的这个操作吧,那其实就是这个便利了啊。便利的话呢,你看我们map点,咱先遍历一下谁呀。直接变成N得了。啊,还是最难的是吧,好,那我们就调这个ENT side吧。然后你看下它这个防治类型。有点复杂是吧,诶alt加个回车,诶自动生成。这是自动生成的哈,这个大家可能看起来有点吃力。咱们自己写来。首先呢,整体来讲是一个set对吧。
25:00
啊,S里边放的是不是一个一个的N垂啊。N呢,最爱暴露呢,它其实是一个内部的接口了,所以你得通过这个外部的去调是吧。哎,就这么着了,然后这entry呢,本身它也是一个泛型的啊,它里边呢,就指明了我的K和Y6的类型了,K呢是死顿类型吧。啊,Y6的是entry啊类型。哎,所以呢,就这样写。啊,有点复杂啊好,那下边的话呢,我们要便利了是吧,电利的话呢,我就调迭代器吧啊e interpretit。来自己写啊,它的返回值类型首先呢,是一个迭代器了吧。迭代器,迭代器里边呢,你得。哎,写一个具体的这个泛型了哈,嗯,迭代器这呢,就是你操作的这个类型,你操作是啥呀。是不是有N啊。Entry吗?是吧,那其实里边呢,是不是还是他。是吧,诶同学说你说哎呀,这个我好像搞不定是吧,搞不定的话你就这么着。
26:03
我就放这儿out,加个回车。这这这能搞定吗。是吧,这种可以是吧。嗯。好回来了啊,现在的话我们来个,然后这里边呢,咱们己。来接收一下,你看这个怎么接收。这就是你这个里边的每一个元素了,其实不就还是它吗。哎,这呢叫一个N垂拉。那就这样啊好,你看这个时候呢,我们就不用考虑做任何的强转啊,它直接呢,就暴露给我们的就是一个N垂了,所以下边的话呢,我拿着这个N垂。点我盖了一个K,这其实你看就是死砖类型的K是吧。哎,然后呢,NT.get一个value。哎,这呢,就是一个Intel类型的一个value。你看这个类型呢,就完全暴露给我们了。非常的方便啊。哎,咱们自己呢,比如说拼接一下。
27:01
哎,加上一下我们这个叫a value。没问题是吧。哎,非常的那个方便啊。好,来,我们做一个执行。哎,OK,这是可以的,所以这块大家写的时候呢,呃,稍微的关注一下,哎,长这样啊。然后再多说一句,在JDK10的时候呢,有一个新特性。啊,这个新特性,然后CTRLC咱们呢,给大家复制一份,诶把这个呢,诶注释一下,这个新特性呢,是这样子的。哎,我呢,直接把这个类型呢,我就忘了,就。完事了。二呢,理解成就是variable变量是吧?啊,这样的一个情况,这个在GS里边呢,都用这个啊。嗯,为什么可以这样做呢?其实也挺合情合理的啊,你像咱们刚才呢,在这个调离方法的时候呢,大家要觉得这个麻烦,是不是光瞄往这一放,奥特回车是自动生成的呀。
28:01
杨安的话呢,就是他知道这个是什么类型,既然他也知道。我们其实也知道。只不过我们可能就不想让自己。看到这么复杂的是吧,诶就玩一下,总之来讲呢,就是我们知道不如编译器知道更直接,你知道就行是吧,我知不知道也也没多大事儿是吧,诶我们就玩就得了,他能认识就行。所以呢,像这种的写法,尤其像这个特别长的,可读性多差呀。哎,就用Y去表示一下。这个我们到后边讲到这个新特性的时候呢,再提一下这个问题哈,诶在这呢是可以用的,你别你别这么着啊,你说这可好了,我定一个变量叫Y哎。这编译器可不知道你这个袜是什么类型的哈,所以你不能随便用啊,我们这个袜呢,说白了其实还是有一个类型推断是吧。是你调完以后呢,它自动能够判别出来什么类型,所以呢,你可以写成Y,你自己定个嗯嗯嗯,根本就不知道啊。行这个执行的话呢,没有任何影响啊。
29:01
可以是吧。行,你要愿意多看一眼的话呢,咱们看一看这个文件,在最起码文件当中看他长啥样。就这个呗。是。你看诶诶我们刚才写的是几。三是吧,啊,这个你回过来,你看这块呢,他给我们自己码文件,我反编译了一下,是不是还是这个完整的写法。啊,也就说呢,编译信他还是认识的啊,他就给我们又还原了,主要呢,就是我们自己看的时候呢,能稍微的省点事而已啊。行,这个我们就啊说到这儿这个呢,就是我们这个,呃,泛型在集合当中的一个使用,哎,通过刚才这个使用呢,其实我们也能看到几个点,哎,稍微的我们做个总结啊。比如说哎,我们在集合当中首先呢,声明了泛刑了,哎,那么在之前的讲解当中,比如说第12章里边,咱们都没有使用泛型。啊,那那没有使用的时候呢,我们认为操作呢,其实都是了。哎,所以这边第一个点啊,说呢这个呃,集合。
30:01
啊。集合框架。在。哎,这个哎声明接口和其啊实现类时。哎,这个我们说呢,使用了泛型,这个呢,是咱们这个GD5.0的时候呢,它不是增加的吗?啊那么在这个实例化。啊,嗯,集合对象时。啊,如果没有使用泛型。啊,这个我们说呢,则认为操作的是。哎,我们说的是,诶,Object类型的这个数据。啊,那么接着哈,这个我们把这句话呢,可以这么着啊。这样啊,接着跟它并列的啊,那呢,诶,如果使用了泛型,则需要指明泛型的具体类型。啊,那么一旦指明了。
31:00
哎,这个泛型的具体类型。啊则哎,在相关的方法中。啊,在我们这个集合的啊。哎,相关的。方法中是吧,凡是使用类的泛型的位置。啊,发型的位置啊,都替换为。哎,具体的。哎,泛型类型。看看这个能看懂吗。就相当于我们刚才提到的啊,像这个release啊,一旦呢,我们在逆我release的时候呢,指明这个E呢是类型,那么在我们整个这个类当中,方法里边也好,属性也好,构造器也好,凡是你使用这个E的地方。它呢都替换为具体的你这个类型,你要是用的in替换呢,下边凡是出现E了,全都是in。啊,就是我们说的这样一个场景啊,行这块呢,大家去注意一下它的一个使用。好,这个呢,是我们演示一下在这个集合当中的一个使用了,包括迭代器啊,那其实呢,我们说还有一个呢,叫做比较器,比较器里边的话呢,也有它的一个使用。
32:09
OK啊,这个比较器的一个使用的话呢,我们课后呢,有一个这样的一个题,这呢是employee,然后呢,里边有这样的麦地的这个属性,还有其他的一个属性,然后呢,我们以吹赛的为例。啊吹态呢,我们要往里边放数据的话呢,需要使用这个啊比较器了,然后我们可以看看这呢是如何体现泛型的使用的,首先的话呢,我们是要把这个数据呢装到这个吹当中。哎,这个呢,数据呢是employee类型的,现在去创建这个employee啊CTRLC。新建一个。Employee。把这个声明呢转过来啊。哎,这样吧,往后一点啊。这么着好,另一个employee类这儿呢,去声明叫private类型类型的name。In the age。Private类型,这个叫my date类型的叫birthday OK,啊,My date类型没有,那咱们就在这停一停也行啊,接着我们回过去呢,去写这个my date。
33:08
CTRL一下。前面我们应该做过类似的这个题。哎,放到这儿。好在这个位置啊,声明private型的year。复制几分。哎,慢和day诶。这就可以了啊,先把这个类呢,我们给大家设计好,首先呢,来一下这个构造器啊,空餐的一个。哎,全餐的一个。哎,盖的方法。嗯,这么着啊,嗯,这个呢,也没提这个兔子怎么写啊。土镇啊,这个肯定得有了啊,加上一个他。嗯,这个呢,要是写法不太好,咱们就把它也改造一下哈。嗯,把这个呢,先删一下。这个呢,叫年月日是吧,都删了重来吧。
34:03
年。哎。哎,这样ctrl alt加个L啊,调试格式行这个类呢就写好了,然后回到employee这块啊,它就不报错了。这边的话呢,我们针对于这样的三个属性,还是这老一套啊做到七。啊,然后呢,全餐的。哎,盖塞的方法。哎,这呢,再来一个图斯string。To string啊行生成一下。好,目前呢,我们就先写成这样子了。来输出一下我们这样的几个属性啊,没问题,好接着回过来说呢,创建该类的五个对象,把这个对象呢放到我们这个吹赛当中,然后呢,需要使用泛型来定义啊,这个呢,吹塞的呢,它本身也有泛型,所以他也得用。来我们这块呢,去演示一下啊,这个我们就叫employee。哎,他的一个测试的。
35:01
好,这呢,我们就写单元测试。哎,过来啊。嗯,来做我们刚才说的这个需求。嗯,这里边儿的话呢,填往这里边听的时候呢,第一个呢,是使用这种自然排序,哎,先看这个。哎,需求一啊,说这个。哎,我们呢,先创建几个员工的对象,然后呢,这块呢要往tree set里边放的话呢,这个呢,我们使用自然排序了,它得实现comp这样接口,这个呢重写的comp方法呢,要求是按name来进行排序的。行,这个事儿呢,我们就清楚了啊,咱们先把这个集合呢,我们先创建出来,有一个呢叫set。Set这块呢,我们在讲它的时候呢,其实当时也提到过哈,Set的话呢,尤其是它在添加这个数据的时候呢,我们没有限制是object,其实呢,当然咱说呢,你必须得放同一个类型的。不是同个类型的,怎么比较大小都不清楚是吧?所以呢,对于吹塞来讲呢,我们加上这个发型呢,意义就很重大了啊。
36:01
一旦我们声明是employee以后。这个我就不用写了啊,这个7.0以后就不用写了,哎,然后这会儿呢,我们再去艾特的时候呢,CTRLP一下只能是添加employ了。啊,这个呢就很好了啊,那提前咱们把这几个对象呢,先给它造出来啊,你一个employee。嗯,这儿呢,我们写名建议大家这块要写的话呢,咱们还是写英文的。因为你写汉字的话呢,咱排序你可能看不出来谁大谁小是吧。OK啊。嗯,写拼音吧。比如说这个,哎,韩美美。嗯,然后呢,逗号。嗯,A是吧。嗯,18岁是吧。啊,然后你一个啊,My date。啊,这里边儿年月日啊,这个我就不去匹配了啊。那1998年的12月21号,比如说啊。啊,在。1234,哎,整个呢,我们来五个啊。
37:02
现在就哎李雷是吧。李雷呢,就。20吧,嗯,这个呢,就九六年的,比如说啊,这个呢11月啊,举个例子啊,还有。嗯。大家那时候学的那个是是他们吗。不是啊,李李华,诶一说李华呢,那就是。李华也在里边。我记得是。啊,这个年龄再大一点。嗯,2000年,比如说啊。这个呢是九月的。12号这我就随机写了啊。再来一个。嗯,张磊,比如说。啊,这这就随便编的了啊。这个来一个19。嗯。997。嗯,这个我就随便来吧,5135啊,有31哈。
38:00
啊,然后呢。张译。然一行这样啊。来一个23。啊,2001年。这个大家现在有这个。应该没有年龄上的压力是吧?诶,我现在一看呢,都有这个这个咱们同事啊,就商务的同事都有2000年以后的,我就感觉倍感压力啊。嗯。他可以是做一些运营啊等等的是吧,好多岗位啊。这个呢,我就诶有五个员工啊,就过来了啊,后来以后的话呢,我们调这个爱的方法啊,这块我们来一个一一是吧。嗯,接着我们就直接复制了啊一二。E3。啊意思。一五是吧。好,这样的话呢,我们就添加了这样的几个员工了,诶添加进去了,添加进去呢,目前我们要运行呢,就挂了是吧。哎,这不就报错了吗?因为呢,咱们还没有让这个employee呢,去实现这个comparable哈。
39:03
好,那找到我们这个employee在这个位置啊,去implement一下啊,Comparable这个呢,去实验的时候呢,你看我们这comparable呢,它自己呢是带泛型的啊。他在泛型呢,我们这块呢,就可以呢,加上这个呢,加的是谁呢,就是你让谁实现的这块加的就是谁。所以呢,对就是employee啊好,这个加上以后我们呢,需要去重启这个方法了啊,比如在这吧,CTRL一下这个方法,你看我们直接呢,OK一下,自然而然的它就是employee了。是因为这个接口里边呢,一旦你这块呢,T是谁,我这个呢T就是谁。OK,没问题啊,回过来。啊,回过来找一下我们这个音,哎。这个我们直接点开吧。行过来了啊,嗯,刚才呢,我们提到了它需要呢,考虑按照这个内幕来进行排序了,那我们在这里边呢,就判断一下这个内幕的事儿了啊,直接呢就依了。这块你不需要呢,在all of employee就是employee了。那if也不用写了是吧,直接呢,我们就哎当前这个对象的name,哎第二我们叫compare to o name。
40:04
呃,假设呢,就是从低到高排,那我们就直接呢,就。听一下是不是就完事了?还挺简单啊,写完了啊,我们在这稍微的注明一下。说按照name哎,从低到高排序。行,这个写完以后啊,那么我们回到这个测试这个层面啊,然后呢,添加呢就没问题了啊,这个你再运行呢,这就是妥的。嗯,加成了啊,加上以后的话呢,我们下面就遍历一下。OK啊,这个呢,拿着我们这个set点啊叫。诶,这块我们alt加回车,自然而然的,你看就也带上这个翻型了。Well return has next。哎,这里边我们调了一的点啊,调net方法,它返回的就都是employee了。啊,直接呢就暴露给我们了啊这个呢调employee,这就调它里边这个图方法了。
41:01
哎,就到这儿了,哎,图方这块呢,Birthday这块呢,我们又重写了图了,这给大家整一个。这整个中号吧。哎,整个中号呢,再整个大括号。因为它里边年月日给它包一下是吧。这是什么呀?啊,这是个字符了。整的还挺严谨的是吧。哎,这么着一下。这就妥了啊,好,回过来,我们自己来测试一下。这呢,就我们看到这样场景,这里边儿呢,我们是按照这个name呢,从低到高排的啊HLZ。这样的场景。没问题,这呢是我们说的这个自然排序,哎,接着我们看第二个需求。这样子啊,正在创建吹赛时,传入一个compare对象,按照生日的先号顺序排,这个就是定制排序了。嗯,回过来。哎,需求二,哎,这么着啊,好单元测试第二个。
42:04
首先的话呢,还是哎,我们呢,去new一个叫a tree set这里边呢。还是放我们这个employee啊。啊,吹啊。Employee。哎,一个set行,那这时候的话呢,我们需要呢,传一个compor提前呢声明好。Aror的话呢,它也有刑。啊,这个呢,我们先比如空着啊,Compor,那这块我们去new一个具体的一个compor。哎,我就先这么着啊好,那么这时候呢,这个发型填谁呀。啊。这个呢,得想清楚这个填谁,你这样想哈,这个compare的话呢,它这是个T,这个T就决定了我们的这个T。看你对前面我们讲比较器的时候理解理解的好不好。嗯,我们现在呢,呃,一个是employee可以选另外一个呢,他说按照生日的先后顺序排列,生日的话呢,就是买date。
43:00
我这写employee还是写my data?写哪个?先买对呀。我又失望了。哈哈。咱们当时讲的时候呢,其实我那时候已经强调过好多次了,这个是谁呢,你填谁,你就这块就是谁。你要往推赛里边填谁呀?你又不是钱买data。是吧,你看我这块我要改了哈,说呢创建吹赛是传入compare对象,按照name的先后顺序排列。你这块会写死准吗?你不会写词钝是吧?嗯,就是你添加到这个集合中的是谁,我们这个比较的不就是谁吗。你生日,你生日,你不就是我的一个属性而已,我只是按照你这个属性来排而已。是吧,可千万不要晕了啊,所以这里边儿呢,我们是这两个对象比较大小的,你填的谁不就是谁比较大小吗?我们填的不是employee吗?
44:00
所以这个一定要小心啊,所以这块呢,我们还是以employ。啊这样写,然后这个位置的话呢,哎,我们这么着一下。然后呢,哎,这么着一下。哎,回过来,然后呢,这块呢,CTRL挨一下。这么着这个呢,你看这是employee了,所以呢,这都是employee,咱们比较的是employee,只不过你比的是它里边的生日的这个属性而已啊。哎,注意行,按照生日的先后顺序来排了。那咱们就先得获取一下是吧,这个比较的话呢,就一点点来了。嗯,诶,有没有同学会这样想啊?怎么想呢,就是这个。O一点,这有一个叫get birthday是吧?盖呢,我们返回的是一个my date的一个实例了。这个麦地的话呢,它有一个呢叫to string的方法。这就字串了是吧,然后呢,我就调一个叫compare to。哎,我就o2.get这个birthday.to string一下说呢,诶这块直接不就是诶比较大小了吗。
45:03
巧妙不?确实很巧妙是吧。哎,这个呢,你比如说是呃,1999年的年,哎,咱们不是这个兔子人呢,是这样写的吗。啊,你假如呢,叫1999年的是吧,嗯,这个怎么着呢,12月。啊,这个,哎,五日。是吧,你这个呢,要是2000年的。怎么怎么着,其实这块在比的时候呢,他这也是一个字符,一个字符比这个一呢,确实比二要小是吧。这个就大。哎,他说你看这个呢,特别讨巧。哎,这个行不行。嗯,我刚才这块写的是啥。是不是compare to吗?哎,把这个反应这结果,你不是按照这个生日的前后顺序排吗?我就给你一个数,谁大谁小不就得了吗。哎,这块呢,注意这样写的话呢,它有一个小问题啊,这个问题在于什么呢?就是年这块呢,可能还好哈,后边这块呢,你要写月的时候呢,我要是12月。
46:08
你这块要写了个五月。这个呢,是拿着五跟一去比的。这会有问题,除非你写成零五,但零五的话呢,我们这个就成了八进制了是吧。因为零开头的不是八进制是吧。哎,所以这样的不能写啊,所以这块呢,你别拿这个字符串去比啊。啊,可能有同学呢,还没明白呢。你当我这没说啊。咱们应该这样写啊,应该这样写,就是你就老老实实的,就先比年,再比月,再比日是吧。嗯,假设呢,我们按照这个先后顺序,就是小的就放前面,比如九九年跟2000年,2000年就大这个意思啊好,那我们就先O一点,Get个一。嗯,Get一个啊不对,先的get一个birthday是吧,再get一个year。这呢,因为都是in的类型了哈,or.get一个birthday.get year。哎,先得到一个具体的,我们比一的一个。
47:00
啊,第一是ten是吧。就是一个差距是吧。好,那么接着我们要看这个值。哎,如果呢,咱们这个页这个decent这个值呢,是不等于零的。那我们就直接呢,就返回这个值了。如果这个叶呢,要是相等的。在比喻吧。哎,O一点get一个birthday.get一个month,再减去O2点get birthday.get一个month。然后我们再得到一个int型的。哎,关于的一个distance。这个呢,我D最好大写啊。这样啊。好慢。第一次三次啊好,然后呢,接着呢来看它。啊,If说,如果这个month的decent是不等于零的。那就说明呢,你这个月份不一样啊,你就返回就行,如果呢,要是等于零,那就走到这儿了。已经只有日了,我们没有的挑了,直接就O一点,Get一个birthday.get一个day是吧,减去二点get一个birthday.get一个。
48:05
诶,是记得这么着起了。啊,这儿呢,就是先比年,再比月,再比日。啊,就这样的一顿操作啊好,那这呢,我们就写完这个compare了,这儿呢,咱们说呢,是一个正确的写法啊。就是不要这样写了。哎,错误的这个写法,但是这个想法呢,其实还挺好的啊。好,这个完了以后的话呢,我们接下来啊,要把这个comp呢,先CTRLC一下啊放到这里边表示呢,我们现在要定制排序了。然后再往后的话呢,就是你添加这个对象了,这个跟咱们前面套路全都一样啊CTRLC。哎,这不就粘过来了吗。啊没问题啊好,现在的话呢,我们对应的这些,呃,生日年份月份是吧,咱们比如说整俩一样的吧,这也是九六年的。啊,月份一样啊,年份一样啊,月份不太一样了。
49:00
行,这个你可以再改啊,比如说这个是2000年的,这个呢也是九月的。啊,这是12号,这是212号这样啊好走起。转一下。行,这时候我们就看到了啊,哎,九六的小是吧,然后五月的在前面11月的后边九八年的2000年的九月的二月,呃,二号12号没问题,哎,从小到大这样去拍。这个呢,就这样来做啊。这个还有问题吗,看看。哎,这样啊,这块呢,其实还可以有一种写法。啊,还可以一种写法,怎么做呢?你看这里边儿,我们比的是这个。MY类型的这个变量是吧,这个my date的话呢,如果说我们要在这块呢,它呢一下。叫comparable。啊,MY。啊,你看我这呢,让他呢也去实现这个接口了。哎,然后呢,怎么着呢,怎么着呢,在这里边我也CTRLL一下。
50:03
我写个compare to。是吧,这呢我怎么写呢,咱们就可以把刚才呢说诶比较这个年月日啊,这个规则呢,我们就写到这儿了,这个就相当于是按照哎生日从小到大排列。诶,其实呢,我就想把刚才那个逻辑呢拿过来。哎,刚才我们这个逻辑呢,整个呢是这样写的是吧,哎,CTRLC一下,诶我们给他拿过来。打过来以后呢,这里边儿这个O1呢。就是这次。啊,这次呢,这个不是这次这个也得去掉了是吧。哎,然后呢,拿着它去替换一下我们这个位置呗。诶,刚才呢,我们OE呢,它是一个object,呃,是一个employee的是吧,诶这个O呢,就是我们这个。哎,这么着。哎,这么着是吧,好这个我就写完了啊,这个写完以后的话,以后的话呢,回过来我说一下这块呢,你就不用呢,在这块呢,吭哧吭哧整那么多了。
51:08
哎,我就一注释正确的写法一。哎,我们呢,在,哎正确的写法二。因为呢,我们此时的my data已经实现了叫compare处理方法了,是吧,所以我们就直接呢,在这个位置呢。怎么写啊?O一点get一个birthday.compare to一下,O2点get一个birthday。哎,是不是就直接这样来处理了。哎,这样写。哎,这个写法呢,其实来源于哪儿这样的一个参照呢。就是我们这个比较name的时候哈。是吧,你比如说咱们这个employee里边写的时候,咱们这块排序比较name的时候,因为呢,它是string类型,String呢已经实现了comparable了,咱们就用了。哎,这块呢也一样,哎说呢我能不能,诶这个呢也涉及到去比较年日的,干脆我让MY呢也实现comparable,然后我们这块呢,我也直接用得了。
52:02
诶就更方便了啊,以后呢,你要别的地方也想用这个,你要这块呢,实现了就每次不用都这样写了,直接呢调一下就行。哎,走一下啊。你看仍然是没有问题的。好,这道题的话呢,我们就诶这样来做这就行啊。行,这道题完了以后的话呢,这块还有一个这个题其实也跟集合相关的啊,这个题呢,不复杂,咱们诶就快速的可以写一下这道题啊。哎,这呢,我们是关于一个练习二是吧,来打开啊没方法。哎,看一下这里边儿这个需求啊。哎,粘过来。哎,看一下啊。哎,首先呢,第一步。这个我们直接给他粘过来吧。说创建个release,指定发型为。2A。啊,这个是list new一个a list,诶搞定是吧,好第二步。
53:07
添加五个零到100以内的随机数啊,到我们这个集合当中啊,那就来个for循环吧。五个啊。这个呢,来一个绿色点I的下边,我们得把这个随机数呢,给它创建出来啊,提前呢,我们给它造出来啊。类型的一个random。呃,零到100,注意是左闭右开的。实际上是零到99是吧。卖random。嗯,然后呢,再乘以小块,这个呢,就是99减去零,再加个一是吧。然后呢,我们在。没了。嗯,直接就行,对。这块呢,我们来一个int。哎,这块呢,括号报一下啊。没问题是吧,好,然后呢,这是一个硬的形的纸,往这一扔就自动装点箱。这呢就添加进去,注意五个哈。搞定啊,下一个。
54:00
使用for意识循环呢,便利一下我们这几个数。For,你看增加for循环,由于呢,你这个例子呢,已经指定是英了,我这块呢,是不是也不用写object了。哎,我也是研究生。嗯,然后呢,我就写一个叫Y6吧,冒号一下list。哎,编了一下嘛,就直接就外流了。啊,这就搞定了啊,来,咱们先看一眼,走起。诶这呢,就我们取的这几个数啊,好下边这个需求,这个需求的话呢,实际上呢,是在我们这个集合当中增加了一个这样的方法啊。这个方法呢叫调用集合的叫木if方法,删除偶数为predict,这个接口呢指定泛型。这个predict的话呢,这是我们最后一章讲这个新特性的时候呢,提到的这种函数式接口了,当然你不知道也没关系啊,不影响你这道题呢去使用。啊,这个是这样的啊,通过这个例子点,咱们调一这个方法呢,叫做。哎,就这个是吧,Remove if。
55:02
哎,调这个方法啊,调这个方法的时候呢,它里边需要传入一个叫predictdic一个接口。这个接口的话呢,咱们先这样点进来啊,是不是就是这个呀。这个没见过的,你先不用管它,你就当成是这个就行啊,嗯,得拗过它了,但拗它的话呢,它里边这个抽样方法呢,是这个。啊,大体的思路呢就有了,哎,这个test的话就是比较谁的意思哈,好,那我这块呢,我就new一个叫。啊,DK。啊,这个我们就自己写啊predict,然后先个小括号,一个大括号,诶整体的话呢,就是这样一个逻辑啊打开好,那么它这块呢,带泛型这个我们比的是谁呢?就是我们这个。所以这块呢,我们ctrl I一下,把这个方法呢,我们给它做一个重写啊,这个呢,就是咱们这个Y6。其实就是你里边具体这个VALUE6这个值了哈,这个value值我们怎么着呢。
56:00
说呢,你要是偶数的话呢,我就删掉你,所以这块我们就判断一下你是不是偶数。所以就Y6呢,咱就取目二呢,等等于零,你是不是偶数把这个呢作为一个波尔型的结果呢,返回就可以了。如果你要是除。我就给你remove。啊,就是艺术出门。是吧?处怎么叫出偶数的时候不就出吗?就这个思路啊,行这呢我们就删了,删完以后的话呢,在使用迭代器呢,便利一下,哎,就是让我们去练这样的几个操作的啊。行,那我们就拿着这个绿色点调。这个咱都已经讲过了啊,哎,返回的就是这样一个结构。哎,Well一下啊,点has next。看点掉这个next这呢,里边就都是in类型啊in类型的。哎,叫Y6了,哎,大一下Y6。这个咱们在这呢,来一个换行操作啊。来,走起。把这个我们就直接就删了啊。
57:02
嗯,OK啊行,上面这块呢,是我们这个随机生成的这样一些数,然后我们把这个偶数呢,都给它删掉,这三个都删掉,还剩这俩。哎,没问题,行,这块呢,我们调用了一个。啊,这样一个函数啊,这其实这块呢,是一个接口了啊。啊,接口以后的话呢,我们这儿呢会用,嗯。拉姆达表达式来写,非常的简单。OK啊,行。呃,然后呢,这块我们里边这个逻辑大家稍微体会下就行,这呢就我们相当于在这个集合当中啊,使用这个泛型,包括呢这个比较细,大家现在把这个题目呢,可以相应的写一写啊。
我来说两句