Kotlin匿名函数使用介绍

目录
  • 1.函数的声明
  • 2.函数参数
  • 3.Unit函数
  • 4.匿名函数
  • 5.匿名函数的参数
  • 6.lambda表达式
  • 7.定义参数
  • 8.匿名函数
  • 9.函数的引用
  • 10.函数类型作为返回类型

1.函数的声明

kotlin中函数的声明和java中有所不同。

1)得有fun关键字修饰,

2)参数的声明方式和变量声明类似 age:Int,先写参数名,后面跟着参数类型

3)  返回值类型写在参数的后面。

//可见性修饰符  函数关键字 方法法名     参数名 参数类型          返回值
private       fun      functionName(age: Int, name: String): String {
    return name + age;
}

2.函数参数

默认值参:如果不打算传入值参,可以预先给参数设定默认值

fun main() {
    //通常调用方式
    fix("xiaohua", 20)
    //age已经给定默认值,此时可以不传参数
    fix("xiaohua")
}
//参数age 给定默认值
fun fix(name: String, age: Int = 18) {
    println(name + age)
}

3.Unit函数

Kotlin中没有返回值的函数叫Unit函数,也就是说他们的返回值是Unit

可以打印一下上面定义的fix函数。打印的值是kotlin.Unit。

  println( fix("xiaohua"))

4.匿名函数

定义时不取名字的函数,被称为匿名函数。

1)具名函数的声明:会显示的使用fun关键字修饰。

//具名函数
fun sayHello(): String {
    return "Hello world!"
}
fun main() {
    //具名函数调用
    println(sayHello())
}

匿名函数:

1)匿名函数虽然没有名字,但是可以赋值给变量,这个变量的类型就是函数类型。就像其他变量赋值那样。

2)和具名函数不一样,匿名函数通常不需要return关键字返回数据。匿名函数会隐式的或自动返回最后一行代码的执行结果。

普通变量赋值:

 val hello: String = "hello"

匿名函数赋值变量:

fun main() {
    //声明一个匿名函数,并赋值给变量sayHello
    val sayHello: () -> String = {
        "Hello world!"
    }
    //匿名函数调用
    println(sayHello())
}

3)匿名函数类型。

普通变量的类型在赋值时就指定了,或者通过类型推断,由编译器在编译器指定变量类型。

那么匿名函数的类型是啥,由啥决定?

匿名函数的类型是由参数和返回值决定的。

fun main() {
    //声明一个匿名函数,并赋值给变量sayHello
    val sayHello: () -> String = {
        "Hello world!"
    }
    //打印函数变量
    println(sayHello)
}

得到的结果是Function0<java.lang.String>

Function0:Function后的数字表示的是参数的个数,0表示无参,1表示一个参数,以此类推。

<java.lang.String> 表示的是匿名函数返回值类型。

5.匿名函数的参数

匿名函数可以不带参数,也可以带一个参数或多个参数。

需要带参数时,参数类型放在匿名函数的类型定义中“()”,参数名放在函数定义中“{}”。

1)一个参数的定义:

fun main() {
    val sayHello: (name: String) -> String = { name ->
        "Hello $name!"
    }
    println(sayHello("HanMei"))
}

当匿名函数的参数只有一个时,可以使用it关键字来表示参数名。当有多个参数时就不能使用了。

fun main() {
    val sayHello: (name: String) -> String = {
        "Hello $it!"
    }
    println(sayHello("HanMei"))
}

2)定义多个参数的匿名函数

fun main() {
    val sayHello: (String, Int) -> String = { name, age ->
        "Hello $name$age"
    }
    println(sayHello("HanMei",18))
}

3)类型推断。

我们知道定义普通变量时,在编码阶段可以不用给变量指定类型。

当我们把匿名函数赋值给变量时,也可以不用指定函数的返回值类型,有编译器进行类型推断。

这时定义匿名函数时的“: () -> String”都可以省略。

无参数时的类型推断:

fun main() {
    val sayHello = {
        "Hello world!"
    }
    println(sayHello())
}

一个参数的类型推断:

参数定义和返回值定义可以省略。但是必须在函数定义中,指定参数类型和参数名。

fun main() {
    val sayHello={ name:String ->
        "Hello $name!"
    }
    println(sayHello("HanMei"))
}

多个参数的类型推断:

fun main() {
    val sayHello = { name: String, age: Int ->
        "Hello $name$age!"
    }
    println(sayHello("HanMei", 18))
}

6.lambda表达式

我们将匿名函数称为lambda函数。将他的定义称为lambda表达式,他的返回结果称为lambda结果

7.定义参数

定义参数是匿名函数的函数:函数的参数是另外一个匿名函数。

1)先定义一个具名函数,接收一个匿名函数为参数。

//定义一个具名函数,接收一个String参数和一个函数参数happyNewYear
//happyNewYear: (name: String, year: Int) -> String 这个就是匿名函数的定义
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {
    val year = 2022
    //在具名函数中调用传递进来的匿名函数
    println(happyNewYear(name,year))
}

2)定义一个匿名函数,调用具名函数时,当作参数传递过去。

fun main() {
    //定义一个匿名函数
    val happyNewYear = { name: String, year: Int ->
        "${name},happy ${year}!"
    }
    //调用具名函数,并把匿名函数当作参数传递
    sayhello("HanMei", happyNewYear)
}

3)上面的匿名函数可以不单独定义,也可以在调用时定义实现。

这种写法和java中的匿名内部类是不是很像。方法的参数new一个接口,实现接口中的方法。

fun main() {
    sayhello("HanMei", happyNewYear = { name: String, year: Int ->
        "${name},happy ${year}!"
    })
}

4)如果lambda是一个函数的最后一个参数,或者是唯一的参数。那么,括住lambda值参的一对圆括号可以去掉。

fun main() {
    sayhello("HanMei") { name: String, year: Int ->
        "${name},happy ${year}!"
    }
}

8.匿名函数

匿名函数还可以用于扩展Kotlin的内置函数。

count是Kotlin用于计算字符串长度的内置函数。

  val word = "HappyNewYear"
  var count = word.count()

用匿名函数进行扩展

    count =  word.count({ letter ->
        letter == 'a'
    })

我们知道:当函数的最后一个参数或只有一个参数是lambda时,那对圆括号可以省略

count =  word.count { letter -> letter == 'a' }

我们又知道,当参数只有一个时,可以用it代替

count = word.count { it == 'a' }

9.函数的引用

要把函数作为参数传递给其他函数,除了lambda表达式,kotlin还提供了其他方法--函数引用

函数引用可以把一个具名函数转换成一个值参,传递给其他函数。

使用lambda表达式的地方,都可以使用函数引用。

1)首先定义两个具名函数:

happyNewYear就是一个普通函数。

sayhello可以接收一个函数参数。这个函数参数可以接收一个匿名函数,也可以接收一个函数引用。

fun happyNewYear(name: String, year: Int): String {
    return "$name happy $year"
}
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {
    val year = 2022
    println(happyNewYear(name, year))
}

2) 函数引用的使用:双冒号+函数名,就是这个函数的引用,可以当做值参传递

fun main() {
    //::happyNewYear这个就是函数的引用,
    sayhello("HanMei",::happyNewYear)
}

10.函数类型作为返回类型

一个函数的返回值,可以是另外一个函数,函数类型也是有效的返回值类型。

sayhello是一个无参的方法,返回值类型是(String) -> String,这个表达的意思就是一个参数为String类型,返回值为String类型的匿名函数。

fun sayhello(): (String) -> String {
    return {
        val year = 2022
        "$it happy $year"
    }
}

调用方法:

fun main() {
    //调用sayhello得到这个匿名函数,并赋值给变量happyNewYear
    val happyNewYear = sayhello();
    //happyNewYear就是一个匿名函数,可以直接传参调用
    println(happyNewYear("HanMei"))
}

注意上面的返回匿名函数有这样一句代码,val year = 2022;这个是定义在匿名函数中的。

也可以定义在外边的具名函数中,匿名函数仍然可以访问的到。

fun sayhello(): (String) -> String {
    val year = 2022
    return {
        "$it happy $year"
    }
}

这就是另外一个概念。闭包

在Kotlin中,匿名函数,能修改并引用定义在自己作用域之外的变量,匿名函数引用着定义自身的函数里的变量。也就是说sayhello返回的匿名函数,可以引用定义它的函数sayhello的变量。

Kotlin的lambda就是闭包。

到此这篇关于Kotlin匿名函数使用介绍的文章就介绍到这了,更多相关Kotlin匿名函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin常用函数let,with,run,apply用法与区别案例详解

    在kotlin编程中let.with.run.apply这些函数使用率是非常高的,有时候可以通用,差别很小,但如果能记住他们的不同点,可以更加合理的选择使用. 在这之前首先要了解一下Lambda表达式的一些规则,这会帮助你理解使用这些函数的时候有没有( )可不可以用it代替参数等.因为这些函数的最后一个参数都是lambda. 如何理解lambda呢?可以把lambda理解为就是一个对象,但这个对象比较特殊,它是一段代码,既然是对象就可以作为函数的参数使用.这种对象称为函数对象. lambda表达

  • Kotlin函数使用示例教程

    目录 我们先看看简单的函数 我们写一个求和函数 函数头 函数体 调用函数非常简单 反编译Java源代码步骤 接下来我们来看看匿名函数 这是接口的声明 我们先看看简单的函数 // 前面的文章我们了解到它是入口函数 fun main() { } // 对应的Java 语言,熟悉的Java 的朋友会发现,哈哈,这就是一个Java静态方法 // 我们通过两种语言的对比,能够对函数有一个更好的理解 public static final void main() { } // 如果没有 Java 基础,不适

  • Kotlin原理详析之拓展函数

    目录 原理 限制 不能访问私有成员 拓展函数不能实现多态 成员函数优先级高,拓展函数不能实现重写 为什么要使用Kotlin中的扩展函数 总结 原理 拓展函数是kotlin里一个比较常用的特性,例如我们可以给Context拓展一个toast方法: // MainActivity.kt fun Context.toast(msg: String) {     Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() } private fun foo(

  • kotlin快速入门之标准函数与静态方法

    目录 标准函数 with run apply 静态方法 单例类实现静态方法 伴生类实现静态方法 注解实现静态方法 顶层方法实现静态方法 总结 标准函数 首先我们介绍标准函数 with.run.apply,如果你了解javascript,那理解kotlin的标准函数width.run.apply那简直不要太轻松.with.run.apply与javascript中的with的意义基本一模一样,只是含有一些细微差别. with with它接收两个参数,第一个参数可以是任意类型的对象,第二个参数是一个

  • Kotlin作用域函数应用详细介绍

    目录 1.前置知识 2.使用 3.源码赏析 3.1 let和run 3.2 also和apply 3.3 repeat 3.4 with 4.反编译 5.小结 平时看博客或者学知识,学到的东西比较零散,没有独立的知识模块概念,而且学了之后很容易忘.于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库,感兴趣的可以点个star~你的star是我写作的巨大大大大的动力),将平时学到的东西都归类然后放里面,需要的时候呢也方便复习. 1.前置知识 在Kotlin中,函数是一等公民,它也是有自己的类

  • Kotlin作用域函数之间的区别和使用场景详解

    作用域函数 Kotlin 的作用域函数有五种:let.run.with.apply 以及 also. 这些函数基本上做了同样的事情:在一个对象上执行一个代码块. 下面是作用域函数的典型用法: val adam = Person("Adam").apply { age = 20 city = "London" } println(adam) 如果不使用 apply 来实现,每次给新创建的对象属性赋值时就必须重复其名称. val adam = Person("

  • Kotlin挂起函数原理示例剖析

    目录 一.序言 二.CPS原理 CPS参数变化 CPS返回值变化 三.挂起函数的反编译 四.伪挂起函数 五.多个挂起函数前后关联 六.在Java中调用suspend函数 七.总结 一.序言 Kotlin挂起函数平时在学习和工作中用的比较多,掌握其原理还是很有必要的.本文将一步一步带着大家分析其原理实现. ps: 文中所用的Kotlin版本是1.7.0. 二.CPS原理 在某个Kotlin函数的前面加个suspend函数,它就成了挂起函数(虽然内部不一定会挂起,内部不挂起的称为伪挂起函数). 先随

  • Kotlin示例讲解标准函数with与run和apply的使用

    目录 1.with 函数 2.run函数 3.apply函数 1.with 函数 首先先从with函数开始,with函数接受两个参数,第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式.with函数会在Lambda表达式中提供第一个参数对象的上下文,并且使用Lambda表达式中的最后一行代码作为返回值进行返回,代码如下: val with = with(obj) { //这里是 obj 的上下文 "value" //with 函数的返回值 } 那么这个函数有什么用的

  • Kotlin匿名函数使用介绍

    目录 1.函数的声明 2.函数参数 3.Unit函数 4.匿名函数 5.匿名函数的参数 6.lambda表达式 7.定义参数 8.匿名函数 9.函数的引用 10.函数类型作为返回类型 1.函数的声明 kotlin中函数的声明和java中有所不同. 1)得有fun关键字修饰, 2)参数的声明方式和变量声明类似 age:Int,先写参数名,后面跟着参数类型 3)  返回值类型写在参数的后面. //可见性修饰符 函数关键字 方法法名 参数名 参数类型 返回值 private fun functionN

  • js的匿名函数使用介绍

    1.匿名函数概述 关于匿名函数的第一次认识还是在jquery源码里,打开jQuery首先看到的是 复制代码 代码如下: (function( window, undefined ) {.......................})(window); 这就是一个匿名函数,红色为参数,匿名函数的作用是创建一块封闭区域,外面不能够访问里面的变量和方法. 既然不能访问,那怎么能调用jquery?这是因为jquery的匿名函数有这样两句话(蓝色字): 复制代码 代码如下: (function( win

  • Python3匿名函数lambda介绍与使用示例

    概述 匿名函数,顾名思义即没有名称的函数,和def定义的函数的最大区别在于匿名函数创建后返回函数本身(即匿名函数不需要return来返回值),表达式本身结果就是返回值,而def创建后则赋值给一个变量名,在Python中,我们利用关键词lambda创建匿名函数,以下是匿名函数lambda表达式的形式: lambda arg1,arg2,.....argn:expression 以下为一些lambda的特点: lambda 是一个表达式,而不是一个语句,即我们可以在任何可以使用表达式的场景一样使用l

  • python ---lambda匿名函数介绍

    lambda特性:"一个语法,三个特性,四个用法" 一个语法 在Python中,lambda的语法是唯一的.其形式如下: lambda argument_list: expression 其中,lambda是Python预留的关键字,argument_list和expression由用户自定义.具体介绍如下. 1.这里的argument_list是参数列表.它的结构与Python中函数(function)的参数列表是一样的.具体来说,argument_list可以有非常多的形式.例如:

  • python基础之匿名函数介绍

    目录 前言 一.创建一个匿名函数: 二.创建一个带参数的匿名函数 三.求两个数的中的最大的值 四.练习题: 前言 在定义函数的时候,不想给函数起一个名字.这个时候就可以用lambda来定义一个匿名函数 语法: 变量名= lambda 参数:表达式(block) 参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数 表达式:不能包含循环.return,可以包含if-else- 注意: 1.表达式中不能包含 循环,return.可以包含 if-else-语句. 2.参数可有可无,如果有多个参数

  • C++11 lambda(匿名函数)表达式详细介绍

    目录 前言 概念及基本用法 捕获变量 lambda表达式类型 声明式的编程风格 总结 前言 Lambda(匿名函数)表达式是C++11最重要的特性之一,lambda来源于函数式编程的概念,也是现代编程语言的一个特点. 优点如下: 声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性. 简洁:不需要额外写一个命名函数或函数对象,,避免了代码膨胀和功能分散. 更加灵活:在需要的时间和地点实现功能闭包. 概念及基本用法 lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的

  • Kotlin作用域函数使用示例详细介绍

    目录 1 let 2 run 3 with 4 apply 5 also 这里我们将介绍Kotlin 5个作用域函数:let,run,with,apply,also. 1 let let 可用于范围界定和空值检查.在对象上调用时,let 执行给定的代码块并返回其最后一个表达式的结果.对象可通过引用它(默认情况下)或自定义名称在块内进行访问. 所以,总结起来,let 有如下三大特征: // 重点11:使用it替代object对象去访问其公有的属性 & 方法 object.let{ it.todo(

  • Javascript中的匿名函数与封装介绍

    迷惑了一会儿不同JS库的封装后,终于有了点头绪.大致就是: 复制代码 代码如下: 创建一个自调用匿名函数,设计参数window,并传入window对象. 而这个过程的目的则是, 复制代码 代码如下: 使得自身的代码不会被其他代码污染,同时也可以不污染其他代码. jQuery 封装 于是找了个早期版本的jQuery,版本号是1.7.1里面的封装代码大致是下面这样的 复制代码 代码如下: (function( window, undefined ) { var jQuery = (function(

  • Javascript中的回调函数和匿名函数的回调示例介绍

    复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 匿名函数自调的意义: 1.营造了一个封闭的空间 2.防止变量冲突 3.有选择性的对外开发(第三方框架都是对js这样封装

随机推荐