Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性

在这里插入图片描述

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。

https://play.kotlinlang.org/byExample/01_introduction/02_Functions

其他关于kt的博客文章如下:

  • Kotlin学习——hello kotlin & 函数function & 变量 & 类 + 泛型 + 继承
  • Kotlin学习——流程控制,when,循环,range工具 & kt里的equals & if实现类似三元表达式的效果
  • Kotlin学习——流程控制,when,循环,range工具 & kt里的equals & if实现类似三元表达式的效果

目录

  • 引出
    • Higher-Order Functions 高阶函数
    • Lambda Functions 函数式编程
    • Extension Functions and Properties 扩展函数和属性
  • 总结

引出


1.kt中高阶函数,返回一个函数;
2.kt里面的函数式编程;
3.扩展函数和属性;

Higher-Order Functions 高阶函数

高阶函数是以另一个函数为参数和/或返回一个函数的函数。

调用传递两个整数值和函数参数:sum的高阶函数

:: 是Kotlin中按名称引用函数的表示法。

package com.tianju.funcKt

/**
 * 以另一个函数作为参数,返回一个函数
 */
fun calculate(x:Int,y:Int,operation:(Int,Int)->Int):Int{
    return operation(x,y)
}

fun sum(x: Int,y: Int) = x+y

fun main() {
    val sum = calculate(4,5, ::sum)
    // 使用lambda 表达式
    val mulResp = calculate(5,6) { a, b -> a * b }

    println("sum is $sum, multiply is $mulResp")
}

(Int)->Int表示平方函数的参数和返回类型

package com.tianju.funcKt

/**
 * (Int)->Int表示平方函数的参数和返回类型
 */
fun operator() : (Int) -> Int {
    return ::square
}

fun square(x:Int): Int {
    return x*x
}

fun main() {
    // 调用operator 获得结果赋值给变量func,
    // 返回的是square函数
    val func = operator()
    println(func(2))
}

Lambda Functions 函数式编程

Lambda函数(“lambdas”)是一种创建特殊函数的简单方法。由于类型推理和隐式it变量,Lambdas在许多情况下可以非常简洁地表示。

  • 如果lambda由单个函数调用组成,则可以使用函数指针(:: )
  • 对于只有一个参数的lambda,可以使用隐式it变量。当可以推断它的类型时(通常是这样),这尤其有用。
package com.tianju.funcKt

val upperCase1:(String) ->String = {str:String ->str.uppercase()}

val upperCase2:(String) ->String = {str -> str.uppercase()}

val upperCase3 = {str:String -> str.uppercase()}

val upperCase4: (String) -> String = {it.uppercase()}

val upperCase5:(String) -> String = String::uppercase

val myCase:(String,Int) -> String = {s, i -> "${s.uppercase()}---$i" }


fun main() {
    println(upperCase1("hello"))
    println(upperCase5("kotlin"))
    println(myCase("Pet",1))
}

Extension Functions and Properties 扩展函数和属性

Kotlin允许您使用扩展机制向任何类添加新成员。也就是说,有两种类型的扩展:扩展函数和扩展属性。它们看起来很像普通的函数和属性,但有一个重要的区别:您需要指定扩展的类型。

在这里插入图片描述

在这里插入图片描述

package com.tianju.funcKt

data class Item(val name: String,val price:Float)

data class Order(val items: Collection<Item>)

// 如果有找到了,返回it.price,否则,返回的是0
fun Order.maxPriceItem():Float =this.items.maxByOrNull {it.price}?.price ?:0f

/**
 * 上面简写的方式展开就是下面这样子
 */
fun Order.maxPriceName():String{
    val maxByOrNull = this.items.maxByOrNull { it.price }
    if (maxByOrNull != null) {
        return maxByOrNull.name
    }else{
        return "NO_PRODUCT"
    }
}

// 为Order类型添加扩展属性。
val Order.allNames:String get() = items.map { it.name }.joinToString()


fun main() {
    val order = Order(
        listOf(Item("apple",12.4f),
            Item("wine",58f))
    )

    println(order.maxPriceItem())
    println(order.maxPriceName())

    println(order.allNames)
}

在这里插入图片描述

甚至可以对空引用执行扩展。在扩展函数中,您可以检查对象是否为null,并在代码中使用结果:

fun <T> T?.nullSafeToString() = this?.toString() ?: "NULL"

总结

1.kt中高阶函数,返回一个函数;
2.kt里面的函数式编程;
3.扩展函数和属性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/188280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Python在3dMax控制网格对象?

我们以一个在3dMax中使用Python脚本在网格对象对象上创建水波变形作为例子。 首先&#xff0c;在3dmax创建两个对象&#xff0c;一个“box”对象&#xff0c;将长宽方向的分段设置的多一些&#xff08;目的是为了后面的水波变形&#xff09;&#xff0c;一个“点”帮助对象&am…

P13 C++ 类 | 结构体内部的静态static

目录 01 前言 02 类内部创建静态变量的例子 03 在类的内部创建静态变量的作用 04 最后的话 01 前言 本期我们讨论 static 在一个类或一个结构体中的具体情况。 在几乎所有面向对象的语言中&#xff0c;静态在一个类中意味着特定的东西。这意味着在类的所有实例中&#xff…

AI换脸教程

方法一、MJ换脸大法 1.点击这个网站添加一个机器人到自己的服务器 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot 2. /saveid 回车选择你自己的照片&#xff0c;并且在名字框命名身份&#xff0c;回车 3.…

Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制

Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制 几点需要知道的信息 【1】crontab一般来说服务器都是有的&#xff0c;依赖crond服务&#xff0c;这个服务也是必须安装的服务&#xff0c;并且也是开机自启动的服务&#xff0c;也就是说&#xff0c;他基本上是…

LiveGBS流媒体平台GB/T28181功能-查看国标设备会话列表直播会话、回放会话、下载会话、对讲会话

LiveGBS流媒体平台GB/T28181功能-查看国标设备会话列表直播会话、回放会话、下载会话、对讲会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、…

Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 iced的基本逻辑是&#xff1a; UI交互产生消息message&#xff0c;message传递给后台的update&#xff0c;在这个函数中编写逻辑&#xff0c;然后通过…

python安装redis库

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

#BUG SHOW# 深挖一个6年前的老“bug”

引言 最近参与了一个业务迁移的项目&#xff0c;需要把站点A迁移到站点B。不同的站点拥有各自独立的服务和数据库&#xff0c;可以说是毫无关联。为了兼容迁移过程中的存在的一部分特殊交易数据&#xff08;正向[支付]交易在站点A&#xff0c;但逆向[退款]操作在站点B操作&…

使用new Vue()的时候发生了什么?

前言 Vue.js是一个流行的JavaScript前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和用户界面。当我们使用new Vue()来创建一个Vue实例时&#xff0c;Vue会执行一系列的初始化过程&#xff0c;将数据变成响应式&#xff0c;编译模板&#xff0c;挂载实例…

基于WSL2+Docker+VScode搭建机器学习(深度学习)开发环境

基于WSL2DockerVScode搭建机器学习(深度学习)开发环境 内容概述&#xff1a;由于最近配发了新的工作电脑但不想装双系统&#xff0c;因此通过本博文来记录基于Windows子系统WSLDocker搭建机器学习与深度学习开发环境的流程步骤&#xff0c;同时记录该过程中所遇到的相关问题及解…

FFmpeg命令分隔视频

有一个视频如a.mp4&#xff0c;此视频采用帧率为30生成&#xff0c;共有299帧&#xff0c;这里通过FFmpeg命令分隔成1秒一个个的小视频&#xff0c;即每个小视频帧数为30帧。 用到的FFmpeg参数如下所示&#xff1a; (1).-i:指定输入视频文件的名称&#xff1b; (2).-c:指…

Guitar Pro软件8.0官方最新版本下载

Guitar Pro 8是一款由法国Arobas Music公司开发的吉他学习与MIDI音序制作辅助软件&#xff0c;它具有丰富的功能&#xff0c;包括吉他谱、六线谱、四线谱绘制、打印、查看、试听等方面&#xff0c;能够帮助音乐爱好者更方便地进行音乐学习和创作。Guitar Pro 8拥有独特的gtp格式…

Jmeter对图片验证码的处理

​对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码的识…

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…

开源称重系统-有源代码

最近发现网上有个不错的开源称重软件&#xff0c;界面做的非常漂亮&#xff0c;收藏一下&#xff1b;还有硬件对接&#xff1a;耀华A9仪表、海康威视监控&#xff0c;IC卡读卡器&#xff0c;控制器对接都有&#xff0c;是个不错的软件&#xff0c;非常感谢作者分享&#xff1b;…

Jenkins 插件下载速度慢安装失败?这篇文章可能解决你头等难题!

Jenkins部署完毕&#xff0c;如果不安装插件的话&#xff0c;那它就是一个光杆司令&#xff0c;啥事也做不了&#xff01; 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI/CD必要插件。 但是问题来了&#xff0c;jenkins下载插件速度非常慢&#xff0c…

使用bard分析视频内容

11月21日的bard update 更新了分析视频的功能&#xff0c;使用方法如下&#xff1a; 1、打开bard网站。https://bard.google.com/ 2、点击插件。 3、点击YouTube中的 research a topic 选项。 4、输入需要分析的内容&#xff1a; Please analyze how many technologies are in…

Compose入门

​ 本篇文章主要是为了对Compose有一个初步了解。知道Compose是做什么的&#xff0c;用Compose能干什么&#xff0c;在目前的各种UI框架下面有些优势&#xff0c;参考Google官网的解释加上一些自己的理解生成的一篇文章。本人也是Compose初学者&#xff0c;通过每一步学习遇到哪…

4.前端--HTML标签3【2023.11.25】

1.表格 1.1表格的作用 表格的作用&#xff1a;表格主要用于显示、展示数据 1.2表格的基本格式 <table><tr><td>单元格内的文字</td><td>单元格内的文字</td>...</tr>... </table><table> </table> 是用于定义表…

[蓝桥杯训练]———高精度乘法、除法

高精度乘法、除法 一、高精度乘法⭐1.1 初步理解1.1.1 高精度的定义1.1.2 为什么会有高精度1.1.3 高精度乘法的复杂度 1.2 思想讲解1.3 代码实现1.3.1 声明1.3.2 实现高精度乘法1.3.3 整体实现1.3.4 代码测试 二、高精度除法⭐2.1 初步理解2.2 思想讲解2.3 代码实现2.3.1 声明2…