00:00
好了,接下来呢,咱们继续再往减下讲一个叫做方法引用和构造器引用。比如说叫P2F。说方法引用,说什么是方法引用?我们为什么要用方法引用呢?我们说如果说当我们写那个LA的时候,如果说在那个lab达体中的内容如果有方法已经实现了,那么我们就可以使用方法引用,说若兰巴表达式对吧?说兰巴体对吧?兰巴体中的内容中的内容有方法已经实现了,那么我们可以可以使用叫做方法引用对吧,法引用或者说我们甚至可以理解为什么呢?说可以理解说方法引用可以理解为说方法引用是LA姆DA表达式的另外一种表现形式对吧?表现形式表现形式可以这样去理解是吧?
01:22
如果你要完成那个拉姆答题,它里边的内容已经有一个方法已经完成了这个功能,那我们就可以使用方法引用的方式,比如说什么方式呢?那首先先介绍一下说方法引用的固定的几种格式对吧?说固定三种主要有三种语法格式对吧?说主要有三种语法格式,这个方法用首先第一个是什么呢?第一个那就比如说叫做对象,然后呢冒号,冒号后面跟实例方法名对吧?实例方法名然后呢,如果是静态方法名,那就是直接一个类,然后再去冒号,冒号后边跟上叫做静态,静态方法名对吧,就类名冒号,冒号后边静态方名,然后还有一种叫提出叫什么呢?就直接也是是类,然后后边冒号问号也是这个实例方法名,但是有个规则咱们一会说啊,说到底什么是方法引用,怎么去用呢?比如。
02:22
是比如说呀,比如说我们说现在呢,我用这个public avoid的TEST1完了,这个回车键又被我敲坏了,又又又给换了,对吧?哎,我上个键盘换是不是给你们上课的时候换了,又坏了又坏了这回车这回车键不结实,比比如说呢,我来个叫做consumer对吧,对吧,然后呢,这个时候呢,呃,就来个stream吧,对吧,还记得consumer吗?消费型接口吗?消费型接口我们说拉姆达表达是消那个实现的话,是不是一个参数啊,一个参数,然后没有返回值,通常我们是不是给它打印输出了呀,对吧?啊比如说把这个X给它打印输出,那么这个时候我们发现再有这个LA的体这一部分,这是不是哪么大题啊,见多。
03:22
右边对吧,箭头操作符右边这是拉姆大体,那用到体的这一部分,我们发现这是不是已经有一个方法完成了我们要操作的功能,也就是个破面的类方法呢?是不是完全我要我要在拉大体中写的功能啊,对吧?那么在这种情况下呢,我们就可以怎么样呢?我们可以用同样的方式呢?用方法引用去完成对吧?注意这个print line它属于一个什么方法呀,它说个实例方法呀,是不是实例方法,实例方法是不是意味着我们得这用这种格式啊,先有个对象的引用冒号,冒号后边跟实例方法什么对吧?也就是大概是这样写的,比如说我们说system.out还记得是system.out是个什么东西吗?哎,打引流是吧,说bring streamam啊对吧?然后呢,这时有了这个对象的实力以后,我就可以看summer street con,然后直接直接用。
04:22
字冒号,冒号叫做parent line连括号都不用写了,看懂吗?对吧?所以就发现我们发现在你这个LA的体中,注意看所我这个LA的中的内容,如果已经有这个方法完成了这个功能的时候,我们就可以用这种叫做方法引用的方式去代替了的表达式,对吧?但是千万要注意的是什么呢?要注意注意啊,这里有点绕啊,要注意什么要注意的就是说。
05:01
你需要实现的这个接口中的抽象方法的参数列表与返回值类型要与我当前调用这个方法的参数列表和返回值类型保持一致。没同明啊,我再说一下啊,注意不要这里稍微有点绕这个方法引用这里稍微这个啊注意看我们现在呢,是不要需要用M的表达式可以实现这个接口啊对吧,拉姆达表达式,然后呢,我们去看这个接口中的作用方法,一个函数没有返回值了,是不是返回值,然后一次呢,我们就可以用拉达表达式去实现,左侧有一个参数,然后右侧LA达体是不是是不是对它的操作呀,什么操作呢?我们要打印操作打印那是不是方法对吧,对吧,那么我们发现实际上这个LY或者说我们怎样去看。嗯,这样实际上也可以行,叫做stream PS一来个PS1.print来print stream。
06:14
这样能看懂吗?上面那种写法能看懂吧,函数我在M的几中说出来就是调用的方法呀,那到几中这个方法,这个是不是已经之前人家已经给我们写好了,对吧,对吧,那么这一次我说如果说呀,你那么呢,体中的这个方法,或者说你拉拉么拉体中这个功能已经有方法完成了的时候,对吧,我们就可以选择用另外一种表现形式,叫做方法引用的方式。看么是吧,就可以用这种形式,但是用这种形式它是不是有一个前提呀,前提就是你这个C要什么来着,就是你需要实现这个接口中的抽象方法中的参数列表吧和反问值类型得与我来,也就是说你让到体重这个方法的。
07:16
参数列表和方式类型是不是保持一致啊,那么在这种情况下,我们就可以用叫做。方法引用了对吧,这就是第一种语法格式,叫做对象冒号冒号实际方法名的方式是不是又变得稍微的简单一点啊,甚至我们说你这个bring line这个你是不是可以给它省略啊,对吧?比如说看string so直接就等于system,这就system.out这是那个实例吧,冒号冒号来,那它会就把我那个打印输出,把我那个参数打印输出,比如说C2点上,我是不是调到CE呀,来把ABCDEFF传过去,注意看这是不是它那个实线呢,实线就是个print y方法右键运行是不是就ABCDF了。
08:11
对吧,说明的定是到的一点啊对吧,理能理解上去吗?能理解吧,就是另外拉大表达式的另外一种表示形式,但是有点有点具用,就是说你需要实现的那个抽象方法的参数列表的反分之类型,在于我方法引用的参数,这表是方呃参数列表用反问之类型最好是一致的对吧?咱们再找个例个练一下啊再找什么呢?比如说我们随便再写一个方法,我们要搞一个叫做呃,S对吧,SULA啊S的这个这个实例Su对吧,我是不是本身要对它进行一个实验呢?可以用拉姆大表式吧,对吧,这个叫做什么什么接口来着,共用几型接口对吧?所以里头有个抽象方法是有参数吗?没有参数,但是有没有反应值,是不是有一个反回值呢?对吧?那么这时呢,我们给他家实现是不没有参数啊。
09:12
对吧,然后呢,没有返回值啊,有返回值,有返回值返回点什么呢?比如说我们返回一个employee吧,Emp等于用一个employee对吧,我返回一个employee get name可不可以是不反方形类形告才么对应上啊对吧,叫做ep.get内是不是搞定对吧对吧?那假如说我要返回到get age能行吗?啊啊我改返回该A,那能行,它通过上下文推算出返回成类型是什么类型是不是S对吧?所以说你人家那里要这个返回子句,你通过上下文推断你要求返回子句,我这里是不是就得返回S句呢?对吧对吧,那我们发现,那当我写这一句代码时,当然我应用的时候是不是就可以sup点上叫做get的方法呀,它会给我返回一个string的SDR,拿到这个stringam,我是不是打印输啊。
10:12
直播暂时我有此句吗?没有此句,我右键运行是个啥呀,是不就是now暂时啊对吧,但是这里是不是就调用了呀,对吧?对使用拉姆达表达式对我这个函数式接口提供了一个实现,那么我们发现那实际上在拉姆达体中的这一部分是不是还是一个方法对吧,也就是说这个方法,这个拉姆到体中的功能,那家另外一个方法是不是给你实现了呢?对吧,那么在这一种情况下,我们就可以用什么呢?叫做什么叫做方法引用嘛,方法引用也就意味着叫做lier对吧呀,然后来个这也是换一种嘛,换到in地址可以吧,对吧?SU2等于我们说刚问题是不是放法挺好了,我们就可以用直接用方法移用,直接用emp增对象引用啊冒号冒号,然后用get age,注意连那个方法的括号都不用写。
11:11
对吧,因为你方法的参数列表是不是跟人家三列中抽象方法的参数列表一样啊,对吧,所以说你就不用写。看吧,对吧,然后呢,就是up2.get的话,它就会给你返回一个地,拿到这个in地,我们就可以c out打印输出,看到吗?对吧,那这时呢,我们来个右键运行,呃,是不是A没没负值就是零啊,默认值就是零,那这个就是方法引用的第一种写法叫做对象名冒号冒号实例名。啊,什么叫多了一步呢?你怎么你还没绕过来啊,咱们这种写法值不到后边能用吗?咱之前讲那么大有啥好处啊,忘了来呐,拉姆达对吧?原来我们是不是你等音频内为啥了呀,对吧?现在你是不是拉姆达就搞定了呀,对吧?然后拉姆DA现在有了一种更好更简单一点的写法,是不是直接用这个呀,这方法已用啊对吧?还记得原来不了,上回小龙吃顿饭睡个觉忘了张一这啊,你自己创建对象的实力是这意思吗?
12:52
那如果用方法用的话,他已经实现这个方法。对吧,那爸经实现,我为什么还要他好好啊,怎么来呢,咱们就往事了,是这个呀,对吧,这说我能为你静态方法没白啊,我们找个它现成的不就得了吗?就是人家API你给我们提供个现成的方法试一下是不就知道明白哪回事了,第一种语法合适明白了吗?
13:22
明白没有,再看第二种,第二种语法式是不是类静态化表明啊,比如说什么意思呢?对吧,咱们再演示这一种。嗯,演示到上面吧,种类静态方法。然后呢,我来个public world test2比如说什么方法呢?我就来这个competor对吧,还记得这个compor吧,Compor是不是比较T啊对吧?比较器比较比较两个什么呢?比如说我就比较两个int,比较两个int的大小对吧,对吧,比较两个int的大小,原来我们是不是得传过去一个X个Y呀,对吧?然后我是试图比较它大小,当然了,X减Y也可以,但是我们上午也发现了,人家in是不是给我其中一个方法直接可以比大小的啊,说一个静态方法叫in点叫做compare方法,把XY往进一传,是不是就可以比大小了,就不用我们自己去手动写这两个的大小的相比较了吧,对吧?那这样的话,是不是用拉么大表达式对这个从这个这个函数的接种做了一个实现的,对吧?那么这时我们又发现了在Lu体中实际上是不是有一个现成的。
14:41
方法已经已经给他写完了,剩啥完了,那么在这种情况下,我们就可以选择用另外一种方式,叫做方法引用的方式去代替LA姆的表达式,对吧?那与刚才的不一样的区别在于我这个comp方法它是一个静态方法,静态方法是不是意味着直接可以通过类名点的方式去调用啊,那就直接comp in,然后来个C1吧,等于方赢吧,直接累了,叫做一张冒号号号compare分号结束,简单吗?简单了吧,这来的简单的这就好了,对吧?那这个就是方法引用的呃用法对吧对吧,就是解决你刚才那个问题对吧?好了,那这样的话是不是比上面那个LA表示还要简单一点啊,对吧,那直接累。
15:41
方冒号方法名消法应了对吧?类冒号冒号静态方法名,但是前提千万不要忘了是什么呢?使用它的一前提呢,就是你,哎,这就是这个参数列表的返回值和返回值就是你,那么体中的这个方法的参数列表和返回值类型要与我函数式接口中抽象方法的呃,参数列表和反围之类型保持一致。
16:15
是吗?对吧,这就是方法应用的特点,所使用的注意对吧?或者在这里,嗯,这里写注意吧,注意注意说呃,拉姆达体中,拉姆达体中调用方法的参数,参数列表与返回值类型,或者说使用的注意事项第一条。这样写,注意一,首先们体中这个方法参数表有反应之类型对吧?要与谁呀?要与函数式,函数式接口中抽象方法的参数列表和返回值类型保持是不一致的,对吧?所以在这种情况下满足的时候,我们就可以用方法引用。
17:16
好用吧,对吧,是不是写起来比原来还简单一点了,简单好多对吧,更简单了,那么再下一个我们发现,诶第三种语法,我们发现用类类名加实例方法名类似是不是也行了呀,对吧,是直接类类类内那实例方法名还知道啥叫实例方法吧,哎,是非正态方法吧,对吧,实例方法说这种在这种它在什么情况下能用呢?比如说比如说在什么情况下能用,给大家演示一个啊说类这种实际方法名怎么用,呃,比如说我现在呢,来一个这个事test是然后来一个什么呢?我要比较,说比较两个字符串是不是一样,是比较两个字符串是不是一样啊,那还就是比较的话,还得比较两个字符串反。
18:16
为一个什么值?哎,是不是错后词了,那四大核心函数接口有提供这个吗?啊,四个核心接口中好像没有吧,所以两个参数返回的不尔就只有一个参数好像不尔呀,对吧,但是没关系,哎,是叫做B叫predict呀,对吧?我们去看上找它的子类呗,对吧,有人叫做B点是有这个对吧?传过去一个T一个U,反回布尔会用吗?虽然这么三个讲是不都类似的呀,对吧,都类似的就be predicted对吧?Predicted好了,传进去一个T一个U,返回一个per是不是这个呀?那就来一个叫做B,是不是这样一个接口啊,比如说我要传进去一个子句和一个子句,是不是传进两个子句呢?然后返回一个符文可以吧,能听明白这个事吧,对吧?然后呢,我目的是。
19:16
这两个大字符量是不是一样,那参数列表有几个,那一个X是不是一个是Y呀,然后减括号,然后是不是x.ESY是这样写对吧?这样写,那么这个呢,是拉么达表达式实现函数接口,那么在写的这个的过程中,我们发现了,发现在拉姆达几中是不是也有一个方法,嗯,对吧,是也是一个方法搞定呢,也是一个方法搞定的,但是呢,与此同时,这个玻璃只是跟一口时,它还是一个什么方法呀,还是一个实力方法吧,对吧,那如那在这种情况下,难道那这我要用它点Y呀,我说那这个实例我们怎么办呢?对吧,实际上在这种情况下,我们也可以用方法引用,这种方法引用的写法我们就可以这样写,所以一个string和一个string,比如BPR吧,等于什么呢?直接string冒画冒号。
20:16
Equals。有问题吗?应该有一个问题吧,再说这刚才你明明说你实你实力方法的调用,你是不是得用对象的引用去调啊,我现在怎么也用类名调用实例方法了呢,对吧?注意它这种,如果这个E口的是实例方法,它用方法引用它也是有规则的,什么规则呢?注意听如果说你这个参这个那表式是不是有两个参数啊,第一个参数是你这个方法的调用者,而第二个参数是你要调用方法的参数十。
21:06
我们就可以使用内名冒号冒号实例方法的方式,再说一遍啊,说本来原来我们应该按理来说调实例方法的话,你是不得通过叫做对象的引用冒号冒号方法明白,但是现在我们发现我们调这个实例方法的时候,我发现用任意名是不也能调了,是懂慢对吧,也能调了,我们说如果你要是这种写法的话,它是有规则的,什么规则呢?就是如这个拉表数是需要两参数,如果说你的第一个参数是这个实例方法的调用者,而第二个参数是这个实例方法的参数实,那在这种情况下,我们就可以使用类名冒号实例方法名的方式。
22:05
听懂吧,对吧,在这种情况下就可以用这种语法格式了啊,所以说啊说呃若对吧,拉姆LA么DA参数列表中,参数列表中的第一个第一个参数是对吧实例方法的调用者,而第二个参数是该是实例方法,实例方法的参数时可以使用,比如说这叫做是不class那类名啊冒号冒号啊叫做man方法名啊对吧,方法名是不是方法名。是吧,对吧,类名,然后慢慢发明,那以上就是方法,你用了三种语法格式对吧?说如果你拉姆达T有有方法已经实现了,我们就可以用方法引用,但是要注意的就是参数列表的返回值类型不一样。
23:10
热闹难的这个还痛,就是那种新的语法是不这种是不就记住就行了呀,这就是新的语法,这人家就是这么规定的对吧?我们记住找到这个规律就可以懂了吗?啊那就是方法引用,一会给大家消化一下啊,方法引用除了除了方法引用以外啊,还有第二个叫做构造器引用和构造器引用对吧?那构造器引用的语法格式呢,也是类似的,是什么样呢?那就直接直接叫做呃,怎么写的叫类类名是不叫class me吗?是类名啊冒号冒号谬,这就叫做构造器引用。那含义是不是就是透明对象的意思啊,是不是创建对象的意思啊,对吧,比如说什么怎么写呢?什么构造器引用引用我这里来一下,比如说构造器引用供给型接口智能创建对象啊可不可以对吧,叫做P的供给型叫做superlier对吧,Superli,比如说我要一个一调用这个方法,它是不是给我来个音employ易对象是这意思吧,Sub等于,那如果用拉姆达表达式我们是不是可以实现呢?实现的话,S里面方法是没有参数列表啊对吧?然后这里边我是不是要拗一个in employ对象啊,直接拗一个是不是in employee,当然是不是也没有参数作为方法的范回值对吧,对吧?那么原来我们可能这样写,所以一定要用,所以一定要用sub点,呃,它叫做get get的方法,它就给我返回一个阴逻辑对象法。
24:53
达到一母对象,我们是不是就可以进行应用了,对吧?那这是原来这叫做拉姆达表达式,那么现在呢,我们说方法引构造器引用,构造器引用的方式可以怎么做呢?叫做s pleasure employee super等于注意构造器,那就是employee冒号,冒号new分号结束。
25:21
搞定吧,那么现在大家有没有点疑问,我这个阴木妈一生生出好几个狗头气,对吧?现在说你俩呀,那你说说我现在调用的是哪一个构导器,有餐的无餐的道理是不跟刚才那个一样,所以说啊,含义就是我构造T的参数列表了,是不构造性的参数列表了,就跟我接口中抽象方法的参数列表一致,是不是就完事了,是不一致啊,那这回你说用的是哪的多导系是互相的啊,我们试试呗,对吧,叫get,它会给我返回,是不是返回employee啊employee吧,拿到employee我是不是可以进一步应用了呀,我see。
26:22
点P一下,这是选中右键运行零到零,0.0是无参的呀,对吧,他说就自动匹配无参多戏了,对吧,对吧,用我。函数式接口的抽样方法的参数列表自动匹配对应的构造系吧,对吧,那么这次来我再来一个,我在我这个lo中呢,我写个别的构造系。Employee employee呢,我们写个一个参数的工作器叫public employee对吧?这里来个叫做int的ID吧,对吧,然后ZID等于ID,那这时候是不是有个一个参数的构造系啊,我现在呢,想搞一个接口呢,搞一个一个参数的构造系,这个怎么来一个参数,就是你传进去一个参数是不是返回去,返回一个值,说白了是传递一个参数返回一个值对吧,用哪个接口,哎,Function数函数是接口啊对吧,方它需要两个是要两个这个泛型一个是参数啊,我参数是不是来个ind啊,返回值了,返回值我们要一个是不是inlo啊对吧?Fun等于什么呢?我们来的表达式是不是实现了啊,那就是一个参数是不是一个参数啊,抽象方法参数一个啊对吧,然后要利用这个参数干什么呢?我要利用一。
27:53
那employee把X传过来,利用X作为参数,是不是创建一个employee对象?
28:01
这没问题吧,对吧,没问题,那就是LA姆达表达式的先了,那我们发现在你拉姆达体中是不是就有一个构造器啊,那我们能不能用构造器引用完成这个事,那就function叫做还是然后要做employee,用I,那就直接in thelo冒号冒号new,那么这一次我问它调用的是哪一个构造器构那实先一个层数构造器呀,对吧,因为我们说它调用哪个构器,它调用的哪个构造器取决于谁呀,取决于方的身高,方法的参数,它有几个参数,它是不是就调用几个参数的构造器了,对吧,我也验证一下M用二点上叫做把play传进去个101对吧,它会给我返回一个1EMPLOYEE那。
29:02
然这个lo我到的EP,他就给我打印了,那这时呢,右键运行是不是101就有了,对吧,101就有,那这时我再反过来问大家,假如说呢,我现在要做什么事呢?我想来。嗯,我要传两个参数,或者这样说,我要我要这样写,呃,BB方式知道什个B方什不对吧,就是它子类子类子类是不T玩啊对吧,就是传个T传个U返回哪了对吧?我要这样写,好像是传进去个in,再传一个in,然后呢返回一个in employee对吧,然后呢,来来BF吧,然后我要这样写,叫做1EMPLOY employee,冒号冒号new,先问这样行不行,为啥?哎说因里没有两个传数的报导器啊,我要想要这句代码通过的话,我必须得怎么样,我说在因果中搞一个两个int型参数的构造器啊对吧,那我再来一个,比如说叫做in的age,再来个this。
30:20
z.H等于H是不是就可以了呀,对吧,那这头回过来它也就过了,那这就是构造器引用,你要调用构造器的参数列表等与我函数式接口中抽象方法的参数列表保持一致。看见没有对吧,那这就叫构造信用行是吧?嗯,注意注意是吧说呃,需要调用的构造器的参数列表要与函数式,函数式接口中抽象方法的参数列表保持一致,是保持一致啊对吧?那么这个构造器引用就可以对。
31:14
有点晕了,这里三音有点用对不道不让是吧,还好还好,对,就是就是一个习惯问题,习惯了以后你会发现会很简单,左手写字啊对吧,就感觉就是完全跟我们原来的写法根本不太一样是吧?下一个咱俩就叫做数组引用,数组是不是也对象啊,那数组也能也能写这个引用对吧?数组引用怎么写呢?前面是tap和tap是类型啊对吧?Tap冒上冒号new对吧是吧,也能完事啊数组引用那就来个数组引用叫做数组引用,数组引用怎么。
32:14
写呢,嗯六比如说呢,我还是这个function对吧?Function,然后呢,我传进去一个in,它给我返回一个什么呢?返回个string的数组可不可以。对不对,六有了七,那这样的话,如果用拉的表达式的话,参数是不是有一个呀,对吧,比如说X,然后呢,我这里是不是来个用一个使均的数组啊,长度是不是X这意思也就是说张小将fun点和盆类传进去的十,这时他给我返回的是个什么东西,是不使菌的数啊对吧?使均的数组,使菌的数组的长度是几?使使使菌数组长度为十啊有机。
33:10
运行是不是就这意思啊,对吧?那么发现along大体是不是只有一个数组就创建呢?那同样的方式我们就可以用数组引用叫function来个in,来个string的,这不仅仅是string,别的别的数组行不行啊,这也可以啊UNUN2,然后来一个直接用string冒号冒号不对,String中号冒号冒号new。对吧,是string中括号啊对吧,数组类型中括号吧,可以吧,对吧,然后这样的话呢,F用二点上叫做叫做open来对吧,传进去一个20,它会给我返回一个string的数组啊对吧,但是这个string的数组的长度是几呢?认识看下面这个啊右键。
34:09
运行是不是20啊,对吧,这就叫数组引用。嗯,集合不是有对象吗?集合是不是也对象啊,对吧,对吧?嗯,当你需要用到的时候,是不是也一样,就跟上面这个不是,这不就是返回的employ吗?你把它变成list不就完事了吗?对啊对吧,搞定了好了,那么以上呢,就是方法引用对吧?它是那可以理解为拉大,是不是另外一种表现形式啊,它让代码更简单了,但是呢,有几个注意事项大家需要注意一下,那么接下来这个事项呢,大家就把这个上午时候做的这个练习题啊,上午做练习题的时候,这里是不自己生成的函数接口,对吧?那么接下来大家试图用自己,就是用人家内置的函数式接口,然后加上这个方法用,把这道题这道题再看一看,把这个方法引用理解一下,消化一下F。
我来说两句