小编给大家分享一下使用芬兰湾的科特林高阶函数的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强>前言强>
芬兰湾的科特林提供了高阶函数这个概念,可以在一些场景提高编码效率
<强>一、什么是高阶函数强>
通俗的说和数学里面的高阶函数概念类似,也就是函数里面的参数可以是函数。当然返回值也可以是函数。
<强>二、芬兰湾的科特林高阶函数使用场景分析
强>
<强> 1。先看看平时使用比较多的内置高阶函数
强>
用芬兰湾的科特林写视图onClickListener的
, tV.setOnClickListener { 是的,,,//以前,,}>里面的兰表达式就是一个函数
不太形象?再看看集合里面的过滤器,地图
自然(1,,2,,3) ,,.filter {祝辞,it 2,} ,,.map {, it +, 5,}/* * ,* Returns a  list containing only elements matching 从而given (谓词)。 ,*/public inline  fun & lt; T>, Iterable.filter(谓词:,(T),→,布尔型):,List , { ,return filterTo (ArrayList (),谓语) } 过滤器,地图的参数都是一个λ函数
<强> 2。高阶函数有什么用强>
就拿过滤器函数来说,比如实现一个过滤的逻辑,判断是符合的
若classA和classB都需要调用这个函数,那么函数就需要兼容这两种情况
fun 过滤():,Boolean { if 才能;(classA), { ,,return 真实的 ,,},else if (classB), { ,,return 错误的 ,,} return 才能;错误的 以前,}>如果无其他可厚非,但是如果后面有classC classD……都需要考虑呢,这显然违背了开闭原则。那么自然是要面向抽象而不是具体,当然就是抽象类或者接口。
若用java的方式去实现,会变成这样
interface IJudge { fun 才能canFilter():布尔 ,} ,class ClassA : IJudge { override 才能;fun  canFilter ():, Boolean { ,,return 真实的 ,,} ,} ,class ClassB : IJudge { override 才能;fun  canFilter ():, Boolean { ,,return 错误的 ,,} ,} ,fun 过滤器(Int, b: Int, jugde:,把):,Boolean {//才能加一些逻辑 return 才能;jugde.canFilter () 以前,}>这个是硬伤,面向抽象就得加这么接口,然后多写一些代码。
若用高阶函数实现
,, fun 过滤器(Int,答:还以为;b:, Int,, canFilter:, (Int, b: Int),→,布尔型):,Boolean {//才能加一些逻辑 return 才能canFilter (a, b) ,}//调才能用方1 过滤才能(1,2),{,答:Int,, b:, Int → ,,a *, b 在10 ,,}//调才能用方2 过滤才能(1,2),{,答:Int,, b:, Int → ,,a +, b & lt; 5 以前,,}>这样就省了个接口,后面分析实际是编译器帮忙处理,其实还是生成了接口
<强>三、芬兰湾的科特林高阶函数的实现强>
来看看芬兰湾的科特林编译器是怎么实现的吧
首先把上面那段芬兰湾的科特林代码反编译成java
kt: fun 才能;过滤器(:,Int,, b:, Int,, canFilter:, (Int, b: Int),→,布尔型):,Boolean { ,,,//加一些逻辑 ,,,return canFilter (a, b) ,,} java: ,public final  boolean 过滤器(int ,, int b, @NotNull Function2 canFilter), { ,,Intrinsics.checkParameterIsNotNull (canFilter,“canFilter"); ,,canFilter.invoke (a, b); ,,return (布尔)canFilter.invoke (a, b); 以前,,}>实际上是kt内置的功能。kt
这里由于我传的是2个参数的λ函数,所以调用的是Function2
<强>那么从这里能得来上面结论:强>
。高阶函数所谓的可以省略接口,其实只能省略只有一个方法的接口,因为函数函数只有一个方法
b。上边的地函数除了canFIlter (a, b)还可以使用canFilter.invoke (a, b)调用。这个在需要对函数判空的时候很有用。比如替换只有一个方法的接口回调可以回调? .invoke (a, b, c),因为callbck ? (a, b, c)是不能编译通过的。
使用芬兰湾的科特林高阶函数的示例