00:00
那接下来呢,咱们就对三个八呢就开始学习,那么首先第一个对吧,我们说三班呢,更新了两大核心,第一个是不是就是这个拉姆达表达式啊对吧,张达提出的一种新的语法格式,那么在讲这个语法格式以前,我们首先得了解一下,我们说为什么要用拉姆达表达式对吧?我们说拉姆达呢,它是一种这个叫做逆名函数对吧,我们说函数我们可以把它理解为什么呀,说说来了就是方法呀,对吧,我们说安达呀,它是一个匿名的函数,我们可以把拉达呢理解为一段可以传递的代码,我们说我们现在呀,可以将代码像传数据一样,把它来回的进行了传递,对吧?那这样的话好处在哪?我们就可以写出更加简洁更加灵活的代码,对吧?然后使人张拉的语言表达能力更能进一步的提升,那么可能我这样说呢,大家可能也没什么感觉,咱们就过来试一试,说张VA8这个拉达表。
01:00
啊是到底有什么好对吧?我过来我们试试说张了八啊对对零一,呃不是,我这是建的啥呀,我得建个项目是吧,建个项目叫做JAVA8-D01,我这里是不是得用JAVA8呀,对吧,你知吧非那是嗯,那这回呢,创建一个包叫爱的硅谷点找吧,然后呢,再创建一个呃类叫做T达拉姆达对吧是吧,T拉姆达,那么接下来我们说到底我们为什么要用这个拉姆达格达式呢?说拉姆达表达式有什么好,咱们说先体会体会啊对吧,先体验体验啊那么首先呢,在说用拉姆达表达式以前,我说拉姆达它解决的是什么问题呢?好在哪?我们说咱们回顾回顾什么呢?回顾回顾叫做原来的匿名内部类,大家还记得匿名内部。
02:00
对不了,对吧,匿名累不累?我说原原来的匿名累不累是一个什么情况呢?比如说我们说匿名累不累,还记得这个东西吧,叫做comp接口就comp啊对吧?然后我说comp比较什么呢?比较两个,这个就比较两个STRING2个的大小吧,就比较细啊对吧,Com等于又一个competor对吧com to啊对吧,是不是又个competor啊,比较两个integer,然后实现comp中的是不是抽象方法呀,在这里边我是不是就可以比较两个in大小了呀,对吧,我说怎么比in大小,其中因对类中呢,也给我们提供了一个compare方法,可以比较O1和O2,这没问题吧,那这是不就是原来的命名内部类啊,是原来的匿名内部类,对吧?然后呢,我们说当用匿名内部类实现了接口以后,我是不是就把可以把这个。
03:00
实例对吧?匿名内部类的实例作为参数是进行传递了呀,我们以前是不是可以传为这个垂set呀,对吧,比如说传in DS等new一个train set就可以把这个。com是不是把这个come是不存过传过来啊ctrl shiftl,那这就是原来的匿名内不类,那么咱们好好看一看这段匿名内不累对吧?我们说实际上有用的代码,也就是说这一段匿名内不内有用的代码实际上就是哪数就说完就这一句,那方法说都没什么用啊,学着核心比较有用的是不是就这一句是不就是这样,剩下那些说都说白了,都支持他的代码啊,其他的都没用,最关键的就是这几句,但是呢,我要为了完成这一句,我是得上下这这么多行,我从都得写出来啊。
04:00
这就是匿名累不类对吧?你们还记不记得咱们当时讲匿名累不累的时候,你们你们是不是挺痛苦的呀,你们说这写的都是什么玩意儿对吧,乱七八糟的,然后实际上是就这只有这么一句有用对吧?那这就是原来的匿名累不累,但是现在呢,我们说在张八中,它现在有了这个叫做LA姆DA表达式,就可以解决匿名内部类的这个问题了,比如说T2,我们说现在拉姆达表达式我们就可以怎么样了呢?我们说实际上最有用的是不是就那一句啊,你就可以。com,然后来个什么呢?小括号X,逗号Y,一个箭头操作符,然后ind.compare X和Y分号结束就完事了,原来你说的写这么一段堆,现在我说说白了就是把那个核心给他提出来了呀,作为一个实现。看了,那么将来我们能怎么用呢?用法就跟匿名内部类的用法一样,我们说给它传给吹塞了呀,叫做吹set,对吧?Ttf用一个set,然后你把。com作为参数传过来,那么这就是LA么达表达式的好处,原来用匿名内部类要写这么多句,现在只需要呃,充其量也就两句,对不对,怎么样,感觉好吗?
05:31
这里咱们写的这个字是什么东西,怎么是不是展示不管呢,你会说我会一点一点教你们呢,你说现在觉得他好不好吧,有的同学说是没啥感觉呀,对吧,说我原来我可能已经多多写了几三四行,我快捷键还能生成,你现在就变成一行,然后让我写一首新的语法,我不愿意对吧,对吧,那么说假如说这一种呢,他说服不了你的话,对吧,那么咱们再来一个说咱们现在干什么呢?咱们考虑这样一个需求,什么需求呢?比如说我现在呀,要那个获取对吧,叫做获取当前公司中对吧?呃,员工年龄大于35对吧,员工信息,员工信息类似于这种查询操作以后,在我们实战中是不是非常非常有用啊,像经常有,就比如说你用淘宝,你有的时候。
06:32
你是不是来个价格比较啊,我取个价格区间对吧,我给它分分类是出长,就在这种情况,那么咱们现在就完成这个操作,咱们就以前的说怎么完成呢?首先别的不说,我是不是得有个员工对象对吧?那这个时候呢,我就来个employee,我去创建一个employee实体类的对象,这个是肯定要有的吧,然后在里边我可能private有string的name private有这个呃,Int的age,然后呢,咱们再来个downloadald salary吧,可以吧,行,暂时就这三个,然后呢,无餐构造器,全餐构造器对应的get set方法,再来一个to string的方法,多余的可以删一删,你说是不是,是不是搞定懂了,然后另呢,将下来我是不是搞个集合啥的,对吧,然后搞一个集合,里面存的都是员工信息,那是不是来个employee啊,叫做employees,然后大家还记得这个东西不啦,其中有个这个东西。
07:32
你还记不记得了什么是就是数组转集合呀,哎,小数组转集合,那这个时候呢,我来点什么呢?在这里我放几个employee,就像他要的是可定参数吧,对吧,我就用一个employ employee employee,然后呢,Name这个叫做张三,张三然后18岁工资是9999.99,分号啊,不是逗号对吧,是不可变财数啊,五个,然后这个呢叫做李四,这个叫做王五,这个叫做赵六,这个叫做田七,他李四38,王五50,然后呢,赵66,田七。
08:23
行,八岁对吧,八岁,然后这个呢,五千五百五十五点六千六百六十六点六六,这个呢是3333.33,这个是7777.77,搞定了,那这些是不是就是我这个集合中的数据啊,对吧,总共常见方式是用这种啊,那接下来我是不是要来个提取啊,那提取的话我是要干嘛呢?我要把大于35的数字给它提出来呀,那也就是我说的写的方法返回值得是个啥,是不是也得是个集合呀,对吧,只不过这次返回的集合中是不是包含着只是大于35的员工信息,对吧?所有大于35,那可能这个方法名我叫做filteril filter employee。
09:11
行,就叫employee思吧,然后呢,你是不是传过来一个集合,你说不传过来一个集合呀,然后把集合就一顿过滤,然后呢,把35的数不是取出来添加到新集合并作为方法的好分值,就是这么做呀,对吧,我们说原来呢都是这么做,我来个叫做employee,来个list,等于不能叫list叫EPS吧,等于呃new一个a release,然后呢,我是不就变利这个参数,这个集合增强for可以变利了,然后呢变利employee EP,然后呢是不判断呢,说如果你从集合取出来这个员工对吧?哎,改位置要是大于等于35的话,那么我就把这个圆动放哪去,eps.s是不把emp加进来啊,最后返回直射EPS,这个没问题吧,对吧。
10:10
啊,我得变利list子吧,说定变你才变利你才数的list子呀,从绿色中取出一个个的员工,我看看这个员工年龄要是大于等于35的话,我就把这个圆工数放到EPS这个集合里,最后把它是作为方法的返回值啊对吧,对吧,那这样的话就搞定,搞定了以后呢,我过来拿过来调用调用试试,对吧,我就在这调用吧,找I test和那个word test3调用,这个叫做filter employee file。T future,我说把我这个employ兹传过来,传过来以后它给我移动过滤,过滤是不是给我返回个集合呀,Employ返回个list对吧?那这个时候拿到集合我是不是给它取出来呀,来个增强负sit out,来个employee,看看是不是把35大于35的都给我过滤出来了,有没有是不啊对吧?以前咱们是不是一直都得这么做,这没啥问题吧?好,那么接下来再来需求啊,变了对吧?需求变成什么了呢?我不仅要获取公司中年龄大于35的员工信息,我还要获取当前公司中员工工资对吧,大于5000的员工信息。
11:32
这又来了,这操作是不是很常见对吧?在淘宝我工资按照这个价格过滤,按照这个什么分类等等,就有很多种过滤方式啊,这是很常见的,为什么现在不仅要按年龄过滤,我现在又多了一个按工资过滤。那是不是意味着我又得来个方法对吧?我又得来个方法,方法返回是按工资过率的employ employee,对吧?那这次呢,可能也叫filter,是不是lo意思啊,当然这一次可能发名是不是就不能这么叫了呀,对吧?角二然后呢,也是你传过来一个集合吧,是不是来个lo啊,是不重来集合,甚至于你能想到我现在里边要写啥,我甚至于我可以把上面这个ctrl c copy过来了,Copy到这来唯独改变一个立方式啊是不就意思,然后我就得把它稍微变变EB点,把它变GA3 ary大于等于50,发现区别就在一句话对不对,那我假如说我现在又来个说我要过滤这个叫做年龄大于小于20的呢,我是不是又得来一个。
12:49
以你上面代码CTRLCCTRLV,唯独变的一句,是不是就这一句麻烦不麻烦,这麻烦吧,这就是之前跟大家说的吧,我们说发现了大量的什么呀,冗余代码,说移动用到这种代代代码,我们是该该想着解决了呀,对吧,找一些解决办法,我们说在原来对吧,我们对这些代码最好的优化方式,那无非也就是啥了,提出提出来,那也不算是最好的优优化方式啊,我们对低一些代码最好的优化方式,那是不是就是设计模式。
13:26
咱们以前也学过很多了,对吧?那思维模式是不是就对代码的一些优化方式啊,一前辈们给我们总结出来解决这种问题的吧,对吧?我们说原来最好的解算法也就是设计模式了,那么于是咱们是不是想对这个电脑来个优化呀,对吧?你说来个优化方式一这怎么用化呢?采用设计模式,这种设计模式怎么用?首先我来个接口,这个接口呢,接口啊,我来一个接口,大家注意看啊,又学了一个新的接口叫什么呢?比如说叫my pro predict Dis。
14:04
是不是一个接口啊,接头我可以声明成带泛型的接口啊,然后在接我我声明一个什么东西呢?声明一个方法,方法返回玻璃,然后方法叫做test,说你传过来一个T,呃,传过来个T,然后我对这个T进行一些操作,返回个玻璃。有问题吗?没问题吧,然后有了这个接口呢,我就可以对这个接口进行一个实现,怎么个实现法呢?比如说我来一个叫做filteril filter employ employee by by什么呢?By age是么?按年龄过滤啊完然后呢,我去employment实现my predict,这次我是my predict的泛型,我要我要用谁呀过滤谁呀,是明显过滤啊,然后实现接口中的抽象方法吧,你传过来是不是应该传过来个employ,然后我在这里就可以写叫做T,这个音lo get a,只要是大于等于35,我就返回真,否则返回假。
15:11
看明白了吗?对吧,搞了个实现类实现这个接口是不实现test啊,于是有了这个东西,我们过来就可以怎么用了呢?上边这两个方法就不要了吧,对吧,我们说要有别的条件,你说还得写好几个,现在不用那么多了,就需要一个对吧,用活方式一呢,就需要一个,什么样的呢?我就需要一个叫做比如说public是不是也是么为集合呀,对吧,也是,毕竟是过滤的吧,对吧,叫做filter,比如说就叫employee吧,对吧,然后呢,我目的是不是对employ进行过滤了,过滤什么呢?说你传过来一个集合叫list对吧,然后呢,我要对这个集合按照my predict的方式进行过滤,是不按照my project方式进行过滤啊,它里边指定的方式进行过滤吧,对吧,那么里边写的是不是就大致就一样了,叫employee EPS等于new。
16:11
这个list,然后呢,是不是增强负循环便利list呀,对吧,然后在这里判断if if什么呢?这回我不能不能大于小于了吧,我用MP里边我是不是写了一个叫做test,我把这个input noee传过去,如果返回真,我就eps.id把employees加集合中。看到吗?对吧,然后最后return谁呢?EPS。看到吧,这样的好处是什么呢?注意现在上面这俩方法是不是都不要了,是这俩方法都不要了呀,现在就开始全新的啦,那这个时候呢,我要用的话,我只需要干嘛,这个时候来个test,是我是不是要调filter,我要过滤员工呢?我要过滤员工,我要把我这个集合里边的传过来了,传过来他是不是需要一个my predict的值啊,我刚才说写了一个my predict的实现,对吧,它需要my pro的类型的值,说白了它就需要一个实现了MY和Du的这个接口实现类的实例,那么那个实例咱们是不是刚才写的呀,叫做filter employee by age,那这样的话它就会给我返回一个list list中的存的是employee,拿到这个employ employee的话。
17:41
我是不是就可以定立了一个便利phase out一下employee回车看看取没取出年龄大于35呢?一直行取出来没有?是取出来的,我说现在的好处是什么呢?好处是方法,我是不是只需要这一个,刚才你是不是写了很多个啊,现在是不是只需要这一个呀,什么意思?也就是说现在我不想按,我不想按年龄过滤了吧,我是不是想按工资过滤?注意现在设计好的东西不用动了吧,我只需要干嘛呢?大家看我的过了啊,我只需要在这里右键嘛,New一个class对吧?那这次比如说叫做filter employee by salary对吧?By salary对不对?然后呢,让他去employment my predict过滤employee吧,实现接口中的抽象方法,然后这次是按什么过滤,大于等于5000。
18:50
注于原来设计好的东西用用吗?是不用的吧,我拿过来说就直接用啊,对吧,我拿回来就直接用,刚才是按这个这个过年龄过滤的,现在我说按想按工资过滤啊,注意想按工资过滤还是调用这个future employee吧,对吧?Future employee方法啊,我传过去个list,然后传一个my predict的值,New future my employee by salary,这样的话它就会给我返回一个list,就不比如说叫LIST2啊,拿到list这一是按什么过滤的,是按salary过滤的呀,按绿的,然后右键运行。
19:38
是不就大于等于五,嗯呃,我变历的是例三二,对呀啊,我怎么把另一传过去了,我说给传一不能里思对吧,我就看你们听课没。是不是大于等于5000呢,对吧,现在比刚才好在哪。
20:03
刚才你说么,要是有什么需求,你都得来一个方法,就这呢,过这年龄35的你来一个吧,过这工资5000的你来一个吧,我说过了年龄20的,你是不是还得来一个方法,过了你工资那个2000的,你是不是还得来一个方法,现在呢,现在你是不是只需要这一个方法,对吧?你有需要的话,你只需要是不是去来这里创建一个类实现这个接口即可呀,对不对,对吧,你还需要写很多很多冗易代码的方法吗?是不用了呀,对吧?那么这种优化方式,这就是设计模式,这种设计模式我们称为叫做策略设计模式,这个也就是说以后我们可能用的,也就是目前来说应用的是不就这种优化了,这已经说比较完善的用化吧,对吧,谁还能有这比这更好的了?这几乎是不是差不多了,对吧,不能说是最好的,那它也是属于那种比较好的优化方式,这没问题吧,那这就是原来,那这就是原来,对或者说是现在,这没问题吧,对吧,那好,那么现在呢,咱们再继续对吧,这叫策略策略模式,什么叫策略策略模式,你说给他什么策略,他就按什么策略过滤,你给他这个策略,他是不按这个策略过滤,你给他这个策略,他是就按这个策略过滤了,对吧?这就叫策略设计模式,但现在呢,稍微这一段呢,写起来稍微还有一有一点不好的地方,你们感觉到了吗?有哪不好的地方感觉到了吗?每次我来个测略,我都得单独搞一个累实现人家接口,然后里边我就写了这么点点,这就麻烦呢,我每次我还得单独给他创建个类,这个类线的是不是多余啊,于是我们是不是就有了优化方式二啊。
21:58
优化方式二叫做匿名内部类,对不对,对吧?然后于是我们就可以完全这样,注意方法还是要人家的方,还是得用这个方法吧,只不过参数把我用的类说是变成了匿名那个类的方式啊,我就完全可以这样写了,我去调用它的话,我就可以叫做TEST5,然后呢,还是方法,还是这个方法,叫做future employee吧,Filter employee,然后呢,我要把这个传过去,紧接着他用我一个my predict吧,那这个时候呢,我就完全可以说new啊my predicted呀,对吧,是不按一摩过滤啊,说这次过滤什么呢?这次咱们过滤点啥呀,比如说工资大呃小用钱吧,可以吧,那就是t.get salary小于等于5000,对吧?这样的话,它是不是会给我返回一个例子呀,粒子中纯呢是。
22:58
Employee啊,过滤后的话,然后拿了以后,我们是不是就来个便利啊,便利了以后,然后我就可以sit out employee,然后右键运行。
23:13
有没有,是不是小于5000倍啊,对吧,小于5000,那这就是第二种预报方式,相较于原来我们说原来我每次我时间间段,我单单独搞个类,麻烦多余一次,我们是不是就有了匿名内部类的方式,我就可以用匿名内部类实现接口,是不是讲匿名内部类传过去啊。以前咱们说这么做不错啊,这挺好的,有问题吗?啊handle德ler也是这么搞对吧?反正就都是这么搞的对吧?那全体解决好的方式就是这样的,但是刚才我们是不是也说了呀,刚才我们说那么我这段匿名累不累,有用的代码你觉得就是哪其就是return治理啊,有用的就这一句,但是呢,我为了知识这一句,我得多学了一二三四五行代码了,是可读性一下子就降低了,对吧?有用的这么一句,你说的就把它读完对吧?哎,结构也乱了,然后呢,可读性也降低了,代码是不是根本不够简洁啊,对吧,除非你是那种早期很老期的那种成序员,那时候的成序员按代码的行数算钱,一行五毛是那那样的话,那那样的,那我们是不是就。
24:33
得这样写了,就这样了吧,对不对,对吧,但现在说不行啊,对吧,啊注注释你就得用文章去表达一下是吧,就中文就来一份,英文就来一份对吧,所以说呢,现在我们发现这个代法可读性比较差,于是我们是不是就有了优化方式三呢?用啥呀,拉姆达表达式对吧,那有了拉玛达表达式,注意我们要怎么用呢?注意看啊,注意方法还是得用这个方法吧,就依然用的是这种策略设计模式的这种情况啊,方法还得用这个filter inlo方法,但是呢,你你内是不是不用了呀,我们就可以这样写了,对吧,叫做future employee,还是要这个方法把我的employees传过去,然。
25:33
然后怎么办呢?这里只需要一个小括号来个E,然后一个箭头操作符来个叫做e.get salary小于等于5000分号结束,它会给我返回一个list存employee,这写看懂了,然后然后是不是变绿啊,然后你们要想变绿的话,那就只需要绿色点for each来个C3.2来,然后去右线运行,这就是小于5000的,你说我写三个,这好四张了吗?感觉怎么样,是不完事了呀,对吧,说你想换大于的,比如说我这这个这是不是大于号啊,比如说这样看的明显一点是不是就有啊,对吧,那这就是赖莫。
26:33
把表达式解决问题,现在只需要把关键点提出来,原来你得写这么多,现在是就把最关键的提取出来了,原来电力集合你得这么便利,现在说就这样了。对吧,感觉怎么样啊,这是挣得少了是吧?对吧?怎么样啊,有想学的欲望吗?还不满意是吗?你觉得这种方式还不够满意,还不满意是吗?还不满意没关系,还有什么呢?还有优化方式四对吧,还有优化方式四对吧,优化方式是什么方式呢?注意现在假设,假设我们刚才那上边所有的代码都没有。
27:40
听懂了,上面所有的代码都没有,但是这个数据是有,除了这个集合以外,对吧?上面所有的代码都没有,这个两个实现类也没有,包括这个接口都没有,明白我现在说的啥意思吧,现在所有的都没有,一捞里有集合有剩下的什么都没有,听懂吧,不就是相当于是啥都没写啊,就一个食品类吗?那么接下来我们说我们可以怎么样呢?我们就可以叫做word的TEST7来什么呢?叫做list点叫做呃,不对,我这叫employee对吧,是不是employee点叫做stream,然后呢,点filter对吧,然后呢,再传一个E,然后呢,大于叫1.getsalary,大于等于5000,然后呢,想要便利点for each c点。
28:41
刚才那些书什么都没有啊,什么都没有,除了集合以外,执行感觉怎么样对吧,比如说我还想怎么样呢,假如说我我说那个现在我这有四个,我就想取钱粮对吧,取前两你怎么办?你只要在这里来看点LIMIT2对吧,然后右键。
29:10
运行啊对吧,感觉咋样对吧?比如说有的时候我们说还有还有什么常见的操作呢?比如说有的时候我说我让你现在把职高中所有人的名字都提出来,有没有这种可能是不有啊对吧,那我说现在原来提名字,你无论如何你是不是来个for循环呢?然后一个个的去get个name啥的呀,对吧,那现在呢,来个employee.stream对吧,点map,然后employee冒号,冒号get name对吧,然后点你想变例出来把名字那就点on来横线下边啊那么右键运行,对这就怎么样,这在怎么样,那么这种优化方式四,我们就称之叫做stream API。
30:11
看懂吗?那这就是张老板,这就是LA的表达式和stream API,有想学的欲望了吗?可以吧,对吧,好啦,那F。
我来说两句