前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin基础

Kotlin基础

作者头像
用户9854323
发布2022-06-25 11:02:46
3210
发布2022-06-25 11:02:46
举报
文章被收录于专栏:小陈飞砖

文章目录

一. Kotlin 基础知识

1. HelloWorld:

代码语言:javascript
复制
fun main(args: Array<String>){
    System.out.println("hello world")
}

2、常见数据类型

3、类型推断

4、取值范围

代码语言:javascript
复制
var aByte:Byte = Byte.MAX_VALUE
var bByte:Byte = Byte.MIN_VALUE

5、函数

代码语言:javascript
复制
fun checkAge(age: Int): Boolean{
    if(age > 18) return true else return false
}

6、字符模版

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

7、字符串比较

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

8、方法参数与null

代码语言:javascript
复制
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
复制
fun gradeStudent(score: Int){
    when(score){
        10 -> println("考了满分")
        8 -> println("还可以")
        6 -> println("刚好及格")
        3 -> println("不行哦")
        else -> println("other")
    }
}

when 条件语句进阶

代码语言:javascript
复制
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
复制
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
复制
var lists = listOf<String>("大米", "鸡蛋", "小米", "薏米")
for(str in lists){
    print(str)
}
  1. list带index
代码语言:javascript
复制
var lists = listOf<String>("大米", "鸡蛋", "小米", "薏米")
for((i, str) in lists.withIndex()){
    print("" + i + " " + str)
    print("$i  $str")
}
  1. Map
代码语言:javascript
复制
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
复制
//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
复制
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
复制
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
复制
while (true) {
    println("请输入数字")
    var str = readLine()
    try {
        var int = str!!.toInt()
    }catch (e: Exception){
        println("大哥,要输入数字哦")
    }
}

15、尾递归优化

二、面向对象

1、继承

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

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

2、接口

代码语言:javascript
复制
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
复制
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
复制
object BigHeadChild : IWash {
    override fun wash() {
    }
}

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

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

5、枚举 和 印章类

枚举:注重数据

代码语言:javascript
复制
fun main(): Unit{
    println(Week.星期一)
    println(Week.星期一.ordinal)
}

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

印章类:注重类型

代码语言:javascript
复制
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
复制
//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
复制
不使用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
复制
没有使用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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
mSectionMetaData?.apply{
     //mSectionMetaData不为空的时候操作mSectionMetaData
}?.questionnaire?.apply{
    //questionnaire不为空的时候操作questionnaire
}?.section?.apply{
     //section不为空的时候操作section
}?.sectionArticle?.apply{
    //sectionArticle不为空的时候操作sectionArticle
}

四、DSL(特定领域语言)

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

代码语言:javascript
复制
//书
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一. Kotlin 基础知识
    • 1. HelloWorld:
      • 2、常见数据类型
        • 3、类型推断
          • 4、取值范围
            • 5、函数
              • 6、字符模版
                • 7、字符串比较
                  • 8、方法参数与null
                    • 9、when 条件语句
                      • 9、循环 和 区间
                        • 10、list 与 map
                          • 11、函数式表达式
                            • 12、默认参数和具名参数
                              • 13、Stirng 与 Int 互转
                                • 14、异常处理
                                  • 15、尾递归优化
                                  • 二、面向对象
                                    • 1、继承
                                      • 2、接口
                                        • 3、代理和委托 by
                                          • 4、单例 object
                                            • 5、枚举 和 印章类
                                            • 三、高阶函数(参数/返回值为函数 )(forEach,map,flatmap,fold,reduce,filter,takeWhite,let/run,also/apply,with,use)
                                              • 1、let函数适用的场景
                                                • 2、with函数的适用的场景
                                                  • 3、run函数的适用场景
                                                    • 4、apply 适用场景
                                                    • 四、DSL(特定领域语言)
                                                    • 五、闭包
                                                    领券
                                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档