使用芬兰湾的科特林高阶函数的示例

  介绍

小编给大家分享一下使用芬兰湾的科特林高阶函数的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强>前言

芬兰湾的科特林提供了高阶函数这个概念,可以在一些场景提高编码效率

<强>一、什么是高阶函数

通俗的说和数学里面的高阶函数概念类似,也就是函数里面的参数可以是函数。当然返回值也可以是函数。

<强>二、芬兰湾的科特林高阶函数使用场景分析

<强> 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)是不能编译通过的。

使用芬兰湾的科特林高阶函数的示例