Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kotlin基础

Kotlin基础

作者头像
用户9854323
发布于 2022-06-25 03:02:46
发布于 2022-06-25 03:02:46
32800
代码可运行
举报
文章被收录于专栏:小陈飞砖小陈飞砖
运行总次数:0
代码可运行

文章目录

一. Kotlin 基础知识

1. HelloWorld:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(args: Array<String>){
    System.out.println("hello world")
}

2、常见数据类型

3、类型推断

4、取值范围

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var aByte:Byte = Byte.MAX_VALUE
var bByte:Byte = Byte.MIN_VALUE

5、函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun checkAge(age: Int): Boolean{
    if(age > 18) return true else return false
}

6、字符模版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun diaryGeneraer(placeName: String){
    var temple = """今天天气晴朗,万里无云,我们去${placeName}游玩,"""
    println(temple)
}

7、字符串比较

Java中不一样,kotlin中 “==” 和 equals() 一样,equals( , true)是忽略大小写

8、方法参数与null

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun test(){
    heat(null)     //编译过
    heat1(null)    //编译不过
}

//参数str可以传null
fun heat(str: String?): String{
     return str + "热"
}

//参数str 不可以传null
fun heat1(str: String): String{
    return str + "热"
}

9、when 条件语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun gradeStudent(score: Int){
    when(score){
        10 -> println("考了满分")
        8 -> println("还可以")
        6 -> println("刚好及格")
        3 -> println("不行哦")
        else -> println("other")
    }
}

when 条件语句进阶

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun diaryGenerator(placeName: String){
    var diary = """今天天气晴朗,我们去了${placeName}玩,
        |刚进大门首先印入眼帘的是${placeName}
        |${strNum(placeName.length)}个镏金大字""".trimMargin()

    print(diary)
}


fun strNum(score: Int): String{
   var result = when(score){
        1 -> "一"
        2 -> "二"
        3 -> "三"
        4 -> "四"
        else -> "地名太长了"
    }
    return result
}

9、循环 和 区间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(): Unit{
    var nums = 1 .. 100   //闭区间[1, 100]
    var result = 0;
    for(num in nums){     //循环:in可以把数组中的数字取出来
        result = result + num
    }

    print("结果是" + result)
    print("结果是${result}")
}

开区间:
var nums = 1 until 100   //闭区间[1, 100)

step:
var nums = 1 .. 100
for(num in nums step 2){
    print("${num} ,")
}

反转:
var nums = 1 .. 100
var nums1 = nums.reversed();
for(num in nums1 step 2){
    print("${num} ,")
}

10、list 与 map

  1. list不带index
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var lists = listOf<String>("大米", "鸡蛋", "小米", "薏米")
for(str in lists){
    print(str)
}
  1. list带index
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var lists = listOf<String>("大米", "鸡蛋", "小米", "薏米")
for((i, str) in lists.withIndex()){
    print("" + i + " " + str)
    print("$i  $str")
}
  1. Map
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var map = HashMap<String, String>()
map["good"] = "好"
map["yes"] = "是"
map["no"] = "不"

for(str in map){
    println(str)
}

println(map.get("good"))
println(map["good"])

11、函数式表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1、
fun add(x: Int, y: Int): Int{
    return x + y
}

//2、当函数体只有一句代码时:,
fun add(x: Int, y:Int):Int = x + y

//3、还可以写成这样
var sum = {x:Int, y:Int -> x+y}
var i = sum(3, 5)    //调用

//4、
var sum1:(Int, Int) -> Int = {x,y -> x + y}

12、默认参数和具名参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(): Unit{
    sum()
    sum(1, 3)
    sum(x = 3)
    sum(y = 9)   //具名参数
}

//默认参数
fun sum(x:Int = 2, y:Int = 5): Int{
    return x + y
}

13、Stirng 与 Int 互转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(): Unit{
    var str = "123"
    var int = 123;
    var strInt = "123abc"

    int  = str.toInt();
    str = int.toString();
    int = strInt.toInt();   //编译器会报错java.lang.NumberFormatException: For input string: "123abc"
}

14、异常处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (true) {
    println("请输入数字")
    var str = readLine()
    try {
        var int = str!!.toInt()
    }catch (e: Exception){
        println("大哥,要输入数字哦")
    }
}

15、尾递归优化

二、面向对象

1、继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
open class Fathor{           //被继承需要open
    var chactor: String = "性格内向"
    open fun action(){      //被复写需要open
        println("喜欢思考")
    }
}

class Son: Fathor(){  
    override fun action() {      //复写需要override
        println("儿子很乖")
    }
}

2、接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Iman {
    fun say()
}

abstract class Human(var name:String){
    abstract fun eat()
}

class Man(name: String) : Human(name), Iman {

    override fun eat() {
        println("大口吃")
    }

    override fun say() {
    }
}

3、代理和委托 by

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface IWash {
    abstract fun wash();
}

class BigHeadChild : IWash {
    override fun wash() {
    }
}

class SmallHeadFather : IWash by BigHeadChild(){
   override fun wash() {
        println("我是大头爸爸,儿子帮我洗碗")
        BigHeadChild().wash()
   }
}

4、单例 object

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object BigHeadChild : IWash {
    override fun wash() {
    }
}

调用的时候()去掉
class SmallHeadFather : IWash by BigHeadChild{

    override fun wash() {
        println("我是大头爸爸,儿子帮我洗碗")
        BigHeadChild.wash()
    }
}

5、枚举 和 印章类

枚举:注重数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(): Unit{
    println(Week.星期一)
    println(Week.星期一.ordinal)
}

enum class Week{
    星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日,
}

印章类:注重类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main(): Unit{
    var s1:Son = Son.小小驴()
    var s2:Son = Son.骡子()
}

sealed class Son{
    fun sayHello(){
        println("大家好")
    }
    class 小小驴() : Son()
    class 骡子(): Son()
}

三、高阶函数(参数/返回值为函数 )(forEach,map,flatmap,fold,reduce,filter,takeWhite,let/run,also/apply,with,use)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//maxBy
printGirl(grilList.maxBy { it.height })    //Java 中需要遍历一遍

//minby
printGirl(grilList.minBy { it.height })

//filter
println(grilList.filter {
    (it.height > 123) and (it.height < 1234)
})

//map
var result = grilList.map { "${it.name} : ${it.height}" }
println(result)

//any  是否有
println(grilList.any{ it.height == 1253})

//count
println(grilList.count{ it.height <= 1253})

//find 查找第一个符合条件的
println(grilList.find{ it.height == 1253})

//groupBy   根据不同的条件分组
println(grilList.groupBy{ it.address})
println(grilList.groupBy{ it.address}.get("北京"))
println(grilList.groupBy{ it.address}.get("北京")?.forEach { printGirl(it) })

//let
grilList.get(0)?.let { printGirl(it) }

1、let函数适用的场景

参考:https://blog.csdn.net/u013064109/article/details/78786646 场景一: 最常用的场景就是使用let函数处理需要针对一个可null的对象统一做判空处理。 场景二: 然后就是需要去明确一个变量所处特定的作用域范围内可以使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
不使用let,不够优雅

mVideoPlayer?.setVideoView(activity.course_video_view)
mVideoPlayer?.setControllerView(activity.course_video_controller_view)
mVideoPlayer?.setCurtainView(activity.course_video_curtain_view
)

使用let
mVideoPlayer?.let {
           it.setVideoView(activity.course_video_view)
           it.setControllerView(activity.course_video_controller_view)
           it.setCurtainView(activity.course_video_curtain_view)
}

2、with函数的适用的场景

适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,经常用于Android中RecyclerView中onBinderViewHolder中,数据model的属性映射到UI上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
没有使用with前:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {

   ArticleSnippet item = getItem(position);
              holder.tvNewsTitle.setText(StringUtils.trimToEmpty(item.titleEn));
           holder.tvNewsSummary.setText(StringUtils.trimToEmpty(item.summary));
                String gradeInfo = "难度:" + item.gradeInfo;
                String wordCount = "单词数:" + item.length;
                String reviewNum = "读后感:" + item.numReviews;
                String extraInfo = gradeInfo + " | " + wordCount + " | " + reviewNum;
                holder.tvExtraInfo.setText(extraInfo);
                ...
}

使用with后:   $代替item
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   with(item){
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
           holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
           holder.tvExtraInf.text = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
   }
}

3、run函数的适用场景

适用于let,with函数任何场景。因为run函数是let,with两个函数结合体,准确来说它弥补了let函数在函数体内必须使用it参数替代对象,在run函数中可以像with函数一样可以省略,直接访问实例的公有属性和方法,另一方面它弥补了with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理。

run函数使用前:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   with(item){
           holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
           holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
           holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
  
   }
}

使用run后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
override fun onBindViewHolder(holder: ViewHolder, position: Int){
  getItem(position)?.run{
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
           holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
           holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
   }
}

4、apply 适用场景

整体作用功能和run函数很像,唯一不同点就是它返回的值是对象本身,而run函数是一个闭包形式返回,返回的是最后一行的值。正是基于这一点差异它的适用场景稍微与run函数有点不一样。 apply一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值。或者动态inflate出一个XML的View的时候需要给View绑定数据也会用到,这种情景非常常见。特别是在我们开发中会有一些数据model向View model转化实例化的过程中需要用到。

没有使用apply函数的代码是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mSheetDialogView = View.inflate(activity, R.layout.layout_sheet_inner, null)
mSheetDialogView.course_comment_tv_label.paint.isFakeBoldText = true
mSheetDialogView.course_comment_tv_confirm.paint.isFakeBoldText = true
mSheetDialogView.course_comment_seek_bar.max = 10
mSheetDialogView.course_comment_seek_bar.progress = 0

使用apply函数后的代码是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mSheetDialogView = View.inflate(activity, R.layout.layout_sheet_inner, null).apply{
   course_comment_tv_label.paint.isFakeBoldText = true
   course_comment_tv_score.paint.isFakeBoldText = true
   course_comment_seek_bar.max = 10
   course_comment_seek_bar.progress = 0
}

多层级判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (mSectionMetaData == null || mSectionMetaData.questionnaire == null || mSectionMetaData.section == null) {
       return;}
       if (mSectionMetaData.questionnaire.userProject != null) {
             renderAnalysis();
             return;}
             if (mSectionMetaData.section != null) {
                   fetchQuestionData();
                   return;}

apply优化后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mSectionMetaData?.apply{
     //mSectionMetaData不为空的时候操作mSectionMetaData
}?.questionnaire?.apply{
    //questionnaire不为空的时候操作questionnaire
}?.section?.apply{
     //section不为空的时候操作section
}?.sectionArticle?.apply{
    //sectionArticle不为空的时候操作sectionArticle
}

四、DSL(特定领域语言)

只有一个参数,且用infix修饰的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//书
class Book{
    //infix 自定义运算符的中缀表达式。本没有on,自定义一个,不需要类名.方法即可调用
    //传入任意类型,返回一个Boolean类型的参数
    infix fun on(any: Any): Boolean{
        return true
    }
}
//桌子
class Desk

fun main(args: Array<String>) {
    if(Book() on Desk()){
        println("书在桌上")
    }
}

五、闭包

kotlin学习笔记之闭包

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kotlin中 四个提升逼格的关键字你都会了吗?
let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择;let函数另一个作用就是可以避免写一些判断null的操作。
Android技术干货分享
2019/07/03
6270
Kotlin中 四个提升逼格的关键字你都会了吗?
with、run等函数使用教程
在Kotlin中对Java中的一些的接口的回调做了一些优化,可以使用一个lambda函数来代替。可以简化写一些不必要的嵌套回调方法。但是需要注意:在lambda表达式,只支持单抽象方法模型,也就是说设计的接口里面只有一个抽象的方法,才符合lambda表达式的规则,多个回调方法不支持。
派大星在吗
2022/01/01
5590
一篇就够——Kotlin快速入门
之前零零散散的学过Kotlin,但是不成体系。最近,每天早起,利用上班之前的四个早晨,将传智播客的《Kotlin从零基础到进阶》又刷了一遍,并做了相应的笔记——也就是这篇文章。
CnPeng
2020/08/11
1.8K0
Kotlin难点
所有函数类型都有一个圆括号括起来的参数类型列表以及一个返回类型:(A, B) -> C 表示接受类型分别为 A 与 B 两个参数并返回一个 C 类型值的函数类型。 参数类型列表可以为空,如 () -> A,Unit 返回类型不可省略。
六月的雨
2023/05/26
4480
Kotlin难点
一次使用Kotlin实现酷炫多选操作的尝试
“手机上的多选很难操作”,我们的设计师Vitaly Rubtsov如是说。大多数应用中的多选方案 -Telegram, Apple Music, Spotify等等- 通常都不是那么灵活,用起来也不舒服。
AWeiLoveAndroid
2018/09/03
1.2K0
一次使用Kotlin实现酷炫多选操作的尝试
StringUtils常用方法
判断传入的字符串是否为空,为空true,不为空false;为空标准:str == null 或 str.length() ==0
后端码匠
2021/04/02
7090
Kotlin之旅——类特性
Kotlin 的类特性 写了两篇 PWA 了,今天继续讲回 Kotlin。 Kotlin 中有很多非常好的特性,扩展方法、伴生对象、原生支持动态代理、伪多继承。今天来详细讲讲。 类的扩展 在 Java 开发的时候,经常会写一大堆的 Utils 类,甚至经常写一些common包,比如著名的 apache-commons系列、Guava等等。 如果每个类在想要用这些工具类的时候,他们自己就已经具备了这些工具方法多好,Kotlin的类扩展方法就是这个作用。 扩展方法 在之前的文章中我就讲过扩展方法了,这里就不
用户1907613
2018/07/20
8970
第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)
根据Realm Report (2017-Q4,https://realm.io/realm-report/2017-q4 ) ,过去的一年在Android 端的开发:Java 从 95% 降低到 Java 85%, 而 Kotlin 从 5% 涨到 15% ,如下图所示
一个会写诗的程序员
2018/08/17
2.8K0
第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)
第14章 使用Kotlin 进行 Android 开发(2)
我们使用 fastjson 来解析这个数据。在 app 下面的 build.gradle中添加依赖
一个会写诗的程序员
2018/08/17
1.1K0
第14章 使用Kotlin 进行 Android 开发(2)
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 出自于捷克一家软件研发公司 JetBrains ,这家公司开发出很多优秀的 IDE,如 IntelliJ IDEA、DataGrip 等都是它的杰作,包括 Google 官方的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。
Seachal
2023/05/20
1.3K0
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 轻量级Android开发
它由Jetbrains创建,而Jetbrains则是诸多强大的工具(如知名的Java IDE IntelliJ IDEA)背后的公司。Kotlin是一门非常简单的语言,其主要目标之一就是提供强大语言的同时又保持简单且精简的语法。
Yif
2019/12/26
9410
Kotlin基本语法和使用技巧
take是从集合中取前几个元素 takeLast是从集合中取后几个元素 sortedBy 排序 过滤list,符合过滤条件的就是过滤结果 filterNot把符合条件的过滤掉,剩下的是结果。这个操作和 filter 相反 slice,取集合中的某一部分
六月的雨
2020/03/27
8690
Kotlin修炼指南(一)
最近会写一些关于kotlin的文章,主要是为了引出函数式编程的概念,并介绍kotlin中的一些骚操作。第一篇文章主要介绍作用域函数。
用户1907613
2019/10/13
6300
kotlin--综合运用Hilt、Paging3、Flow、Room、Retrofit、Coil等实现MVVM架构
前面我们使用Java来运用JetPack中的一系列组件,又使用kotlin运用这些组件实现了一系列功能: kotlin--Flow文件下载 kotlin--Flow结合Room运用 kotlin--Flow结合retrofit运用 kotlin--StateFlow运用 kotlin--SharedFlow运用 接着,Jetpack的Paging3中,我们使用的语言是kotlin,相信通过这些项目的对比,你就能发现koltin取代Java的理由了,kotlin拥有更好的扩展性,更高的性能,更简洁的代码,更好
aruba
2021/12/06
3.6K0
kotlin--综合运用Hilt、Paging3、Flow、Room、Retrofit、Coil等实现MVVM架构
Kotlin | 作用域函数
Kotlin 标准库包含了几个特殊的函数,其目的是在调用对象的上下文环境(context)中执行代码块。当你在提供了 lambda 表达式的对象上调用此类函数时,它会形成一个临时作用域。在此作用域内,你可以在不使用其名称的情况下访问该对象,这些函数被称为作用域函数。在 Kotlin 中,作用域函数总共有五个,分别是:let、run、with、apply、also。接下来我们逐个详细分析。
SkyRiN
2019/05/14
9810
Kotlin入门(23)适配器的进阶表达
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。随着用户的下拉或者上拉手势,已经被回收的列表项要重新加载到界面上,倘若每次加载都得从头创建视图对象,势必增加了系统的资源开销。所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接从持有者处获得先前的视图对象,从而减少了系统开销,提高了系统的运行效率。 视图持有者的设计理念固然美好,却苦了Android开发者,每次由BaseAdapter派生新的适配器类,都必须手工处理视图持有者的相关逻辑,实在是个沉重的负担。有鉴于此,循环视图的适配器把视图持有者的重用逻辑剥离出来,由系统自行判断并处理持有者的重用操作。开发者继承RecyclerView.Adapter之后,只要完成业务上的代码逻辑即可,无需进行BaseAdapter视图持有者的手工重用。 现在由Kotlin实现循环视图的适配器类,综合前面两小节提到的优化技术,加上视图持有者的自动重用,适配器代码又得到了进一步的精简。由于循环视图适配器并不提供列表项的点击事件,因此开发者要自己编写包括点击、长按在内的事件处理代码。为方便理解循环适配器的Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码:
aqi00
2019/01/18
1.8K0
【Kotlin】Kotlin 语言基础 ( 环境安装 | 变量 | 简单使用 | 函数 | 异常 | 递归 )
IntelliJ IDEA 安装 : 下一步 -> 下一步 即可, 全部默认设置;
韩曙亮
2023/03/27
4.5K0
【Kotlin】Kotlin 语言基础 ( 环境安装 | 变量 | 简单使用 | 函数 | 异常 | 递归 )
用kotlin打造简化版本的ButterKnife
大名鼎鼎的 ButterKnife 库相信很多 android 开发者都听过,在 Github 上star的数目已经快15k了,而且很多知名的app都在使用。
fengzhizi715
2018/08/24
8850
用kotlin打造简化版本的ButterKnife
Kotlin —— 这次入门就不用放弃了
声明:本文是FEELS_CHAOTIC原创,已获其授权发布,未经原作者允许请勿转载
用户2802329
2018/08/07
1.7K0
Kotlin —— 这次入门就不用放弃了
使用Kotlin高效地开发Android App(三)
Kotlin基于Java的空指针提出了一个空安全的概念,即每个属性默认不可为null。
fengzhizi715
2018/08/24
8850
使用Kotlin高效地开发Android App(三)
相关推荐
Kotlin中 四个提升逼格的关键字你都会了吗?
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验