Kotlin 全部基础

Posted 黄毛火烧雪下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 全部基础相关的知识,希望对你有一定的参考价值。

IDEA

Kotlin 提供了很多便利,简化了java很多模式化代码。有人说可读性相对较差,习惯之后,会觉得Java不好读。比如:中文思维会觉得英语很难理解,相反而至。每个都要敲代码,磨刀不误砍柴工。泛型如果用好还是有难度的。kt 会越来月流行,不是因为它很强大,而是谷歌在推kotlin,没办法。就说AS 和 eslipse 哪个会一定更好用,并没有。越来越多是kotlin的支持,人世有代谢往来成古今江山留胜迹,我辈复登临。kotlin比java更灵活,移动端不需要那么多并发量。kotlin更像js代码。蹭java 的热度,有有自己的语言,有话语权。移动端开发和前端开发将会有越来越多共同的技术,提升开发效率,降低成本,大势所趋,界面用户体验上的逻辑。新技术出来,天然的抵触,不断的调整心态,新的技术去了解,动向,kotlin 大势所趋,必须学。IT行业,不断有年轻人进入的行业,我们要追随年轻人的脚步。在算法中,函数编程用的比较多。kotlin最大的好处就是支持kotlin和java混编。
直接上项目,用到的知识点只是40%,

1.SHIFT 两下,show kotlin Bytecode

2.kotlin可以使用特殊字符命名函数名,使用反引号括住函数名避免冲突

print(ere("jjj"))
private fun `ere`(name: String, age: Int = 2) 
    print(name + age)

3.匿名函数(函数式编程很流行,应用很广泛)

val total:Int="Mississippo".count()
val totals:Int="Mississippo".count  letter -> letter == 's' 
print(total) 11
print(totals) 4

匿名函数不需要return关键字返回数据,会自动返回最后一行语句的结果

//变量的类型是个匿名函数,无参,返回值是String
val result: () -> String
result = 
    val name = "aaaaa"
    "$name"

//声明的时候赋值
val result: () -> String = 
     val name = "aaaaa"
     "$name"


val result: (Int) -> String =  age ->
     val name = "aaaaa"
    "$name $age"

val result: (Int) -> String = 
     val name = "aaaaa"
    "$name $it"

//类型推断
val result  =  age:Int ->
    val name = "aaaaa"
    "$name $age"

print(result(5)) aaaaa 5

4.IDEA 设置Kotlin 自动类型推断后的类型


5.定义参数是函数的函数


//eg2
showOnBoard("苹果")  goodsName: String, hour: Int ->
    "$goodsName$hour"

fun showOnBoard(goodsName: String, getDiscountWords: (String, Int) -> String) 
    val hour = (1..24).shuffled().last()
    print(getDiscountWords(goodsName, hour))

6.函数内联即预编译指令,宏定义==宏替换

val getDiscountWords =  goodsName: String, hour: Int ->
   "$goodsName$hour"

showOnBoard("苹果", getDiscountWords)
inline fun showOnBoard(goodsName: String, getDiscountWords: (String, Int) -> String) 
    val hour = (1..24).shuffled().last()
    print(getDiscountWords(goodsName, hour))

7.函数引用(lambda可替换)

 showOnBoard("苹果", ::getDiscountWords)
 fun getDiscountWords(goodsName: String, hour: Int): String 
    return "$goodsName$hour"


fun showOnBoard(goodsName: String, getDiscountWords: (String, Int) -> String) 
    val hour = (1..24).shuffled().last()
    print(getDiscountWords(goodsName, hour))

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

//eg1
getFullName("aa", result = 
  print(it)
)
getFullName("aa")  
  print(it)

fun getFullName(name: String, result: (count: Int) -> Unit) 
  result.invoke(name.count())

9.kotlin传递函数=java传递接口

public class aaa 
    public static void main(String[] args) 
        getFullName("aa", new Result() 
            @Override
            public void getResult(int count) 
                System.out.println(count);
            
        );
    
    public  interface Result
        void getResult(int count);
    
    public static  void getFullName(String name,Result result) 
        result.getResult(name.length());

    

10.kotlin中lambda就是闭包,作用域、函数式编程风格

11.字符串操作

substring

const val NAME = "Jimmy's friend"
var index = NAME.indexOf('\\'')
// var str = NAME.substring(0, index)
var str = NAME.substring(0 until index)
print(str) Jimmy

split 返回list集合数据,list集合支持 解构语法特性 ,其常用简化变量的赋值

const val NAME = "Jimmy,Jim,Bob"
val str =NAME.split(",")
var (one:String,two:String,three:String) =NAME.split(",")
println(str) [Jimmy, Jim, Bob]
println("$one $two $three") Jimmy Jim Bob
//跳过某个值,不会赋值,提高代码运行效率
val list = mutableListOf<String>("aa", "bb", "cc")
val (one: String, _: String, three: String) = list
print("$one $three") aa cc

replace 比java更加强大

const val NAME = "The people's republic China."
fun main() 
   val str=NAME.replace(Regex("[ae]"))
        when (it.value)
            "a"->"8"
            "e"->"6"
            else -> it.value
        
    
    println(str) Th6 p6opl6's r6public Chin8.

字符串比较 (内存分配) , == 检查两个字符串中的字符是否匹配,(相当于java中的equals); === 检查两个变量是否指向内存堆上同一对象相当于java中的==)

val str1="aa"
val str2="aa"
println(str1==str2) true
println(str1===str2) true
  
val str1="Aa"
val str2="aa".capitalize()
println(str1==str2) true
println(str1===str2) false

double 转int,double 格式化

//保留两位小数 ,四舍五入
val aa = 200.28212
print( "%.2f".format(aa))

12.标准函数 apply let run(可执行引用函数,链式调用) with(一般不用) alse takeIf

let

fun formatGreeting(guestName: String?): String 
    return guestName?.let  "Welcome,$it"  ?: "What's your name?"


print(formatGreeting(null))  What's your name?

run(可执行引用函数,链式调用)

var file = File("D://demo//111//readme.txt")
val result = file.run  readText().contains("great") 
print(result) true

fun isLong(name: String) = name.length >= 10
fun showMessage(isLong: Boolean): String 
    return if (isLong) 
        "Name is too long"
     else 
        "Please rename"
    

"D://demo//111//readme.txt".run(::isLong).run(::showMessage).run(::print)

run 和with 传参方式不一样

val result = "aaaaaa".run  length > 3 

val result = with("aaaaaa")
  length > 3

alse (我也)返回接收者对象

var fileContents: List<String>
File("D://demo//111//readme.txt")
        .also  println(it.name) 
        .also  fileContents = it.readLines() 
println(fileContents)

readme.txt
[great good]

takeif 如果需要判断某个条件是否满足,再决定是否可以赋值变量或者执行某项任务

val result=  File("D://demo//111//readme.txt")
     .takeIf  it.exists() && it.canRead() 
        ?.readText()
println(result) great good
//不存在
val result=  File("E://demo//111//readme.txt")
     .takeIf  it.exists() && it.canRead() 
        ?.readText()
println(result) null

13.list set

list 通过安全索引函数 获取元素

val list = listOf<String>("aa", "bb", "cc")
println(list.getOrElse(3)  "unknow" )   unknow
println(list.getOrNull(3) ?: "unknow")    unknow

mutable 函数

    val list = mutableListOf<String>("aa", "bb", "cc")
    //运算符重载
    // list.add("dd")
    list += "dd"
    //list.remove("dd")
    list -= "dd"
    //如果此值符合条件,则移除
    list.removeIf  it.contains("aa") 
    //可变和不变相互转换
    list.toList().toMutableList()

list 索引遍历

   list.forEachIndexed  index, s ->  

set 不可重复,elementAt,其余的都和list用户一致

val set = setOf<String>("aa", "bb")
print(set.elementAt(0))

list 转set 去除重复元素 去重

val list = listOf<String>("aa", "bb","bb")
//print(list.toSet().toList())
//快捷函数
print(list.distinct())

数组类型提供各种array 是引用类型,最终编译成java基本数据类型

map,其它操作写法和list大概一致,to 相当于Pair() 函数

 val map = mapOf("aa" to 20, "bb" to 30)
 mapOf(Pair("aa", 20), Pair("bb", 30))
 println(map["aa"])  20
 println(map.getValue("aa"))  20
 println(map.getOrElse("cc")"qq") qq
 println(map.getOrDefault("cc",0)) 0

map 遍历

 val map = mapOf("aa" to 20, "bb" to 30)
 map.forEach 
        println("$it.key,$it.value")
    
 map.forEach  (key: String, value: Int) ->
        println("$key,$value")
    

map 添加元素 getOrPut

    val map = mutableMapOf("aa" to 20, "bb" to 30)
    map += "cc" to 40
    map["cc"] = 40
    //如果没有则增加
    map.getOrPut("dd")  50 
    println(map)

14.kotlin class 类自动生成get/set方法

field 覆盖get、set

class Player 
    var name: String = "j a ck"
    get() = field.capitalize()
    set(value) 
        //去掉前后空格
        field=value.trim()
    


fun main() 
    var p=Player()
    println(p.name)
    p.name="  tom "
    println(p.name)

15.初始化

主构造函数

import kotlin.math.absoluteValue

class Player(_name: String, _age: Int) 
    //临时变量只用一次的用下划线
    //get和set紧跟属性,private说明name只读不可以改变
    var name = _name
        get() = field.capitalize()
        private set(value) 
            field = value.trim()
        
    var age = _age
        get() = field.absoluteValue
        set(value) 
            field = field.absoluteValue
        


fun main() 
    val p=Player("Tom", 30)


在主构造函数里定义属性

class Player(_name: String, var age: Int) 
    //临时变量只用一次的用下划线
    //get和set紧跟属性,private说明name只读不可以改变
    var name = _name
        get() = field.capitalize()
        private set(value) 
            field = value.trim()
        


fun main() 
    val p=Player("Tom", 30)


次构造函数 constructor

class Player(_name: String, var age: Int) 
    //临时变量只用一次的用下划线
    //get和set紧跟属性,private说明name只读不可以改变
    var name = _name
        get() = field.capitalize()
        private set(value) 
            field = value.trim()
        
    constructor(name:String):this(name,100)
        this.name=name.toUpperCase()
    

初始化块 init

init 
        require(age>10)"age must be positive"
    
val p=Player("Tom",9)

初始化顺序
1.著构造函数离声明的属性
2.类级别的属性赋值
3.init初始化块里的属性赋值和函数调用
4.此构造函数里的属性赋值和函数调用

延迟初始化 lateinit,用它的时候再初始化

fun main() 
    var user = User()
  //  user.ready()
    user.battle()


class User 
    lateinit var equipment: String
    fun ready() 
        equipment = "knife"
    

    fun battle() 
   		 //健壮的语言
        if (::equipment.isInitialized)
            println(equipment)
    

惰性初始化 by lazy 延迟记载

fun main() 
    var user = User()
    Thread.sleep(3000)
    user.config


class User 
    //懒汉式
    val config by lazy  loadConfig() 
    //饿汉式,一上来就记载
    //val config =loadConfig()
    private fun loadConfig(): String 
        println("loading...")
        return "xxx"
    

初始化陷阱1-按照顺序来编译,顺序不能写反

class User 
    val blood = 100

    init 
        val bloodBonus = blood.times(4)
    

初始化陷阱2-按照顺序来编译,顺序不能写反

class User 
    val name: String
    private fun firstLetter() = name[0]

    init 
      //一下两个顺序不能反
        name = "Jack"
        println(firstLetter())
    

16.继承

如果继承类,就要用open来修饰;如果子类需要覆盖父类函数,也需要open来修饰

open class Product(val name:String)
	open fun load()="Nothing.."

class AA:Product("aa")
	override fun load()="xxxxx......"

fun main()
	val p:Product=AA()
	println(p.load())
	//类型检测 is
	println(p is Product)


智能类型转换 as,转一次则后面可以直接使用

Any 超类,任意类型 都是Any类 ,Kotlin的跨平台比java更好

object 关键字
单例对象:防止浪费资源;方便管理状态,因为只有一份。

//单例对象
object ApplicationConfig
	

//打印同一个对象
print(ApplicationConfig)
print(ApplicationConfig)

伴生对象 companion

open class configMap
	companion object
		private const val PATH="xxxx"
		 fun load()=File(PATH).readBytes()
	

fun main()
	//比javastatic更加人性化,不调用,则不执行
	ConfigMap.load()

嵌套类

class Player2
	class Equipment(var name:String)
		fun show=println("equipmeng:$ name")
	

fun main()
	Player2.Equipment("knife").show()

数据类 data 专门存数据的类 ,提供 toString / copy(new了新对象,陷阱:不用次构造) / 解构语法

data class Coordinate(var x:Int,var y:Int)
	val isInBounds= x>0

fun main()
	//比较属性的值
	println(Coordinate(10,20)==Coordinate(10,20)) true


解构声明

//必须以下写法
class PlayerScore(val experience:Int,val level:Int)
	operator fun component1()=experience
	operator fun component1()=level

fun main()
	val(x,y)=PlayerScore(10,20)
	print("$x $y")


//数据类支持解构语法
data class PlayerScore(val experience:Int,val level:Int)
fun main()
	val(x,y)=PlayerScore(10,20)
	print("$x $y")

运算符重载

data class PlayerScore(val x:Int,val y:Int)
	operator fun plus(other:PlayerScore)=PlayerScore(x+other.x,y+other.y)

fun main()
	val a=PlayerScore(10,20)
	val b=PlayerScore(10,20)
	println(a+b)

枚举类 特殊类 可以定义函数

enum class Direction(private val score:PlayerScore)
	EAST(PlayerScore(1,2)),
	WEST(PlayerScore(3,2);
	fun updateScore(two:PlayerScore)=PlayerScore(two.x+score.x , two.y+score.y)

fun main()
	print(Direction.EAST) EAST
	print(Direction.EAST.updateScore(PlayerScore(10,10)))  PlayerScore(x=11,12)

代数数据类型 ADT 条件固定,else省略

enum class Direction
	EAST,
	WEST;

class DD(var a:Direction)
	fun check():String
		retrun when(a)
			Direction.EAST ->"东"
			Direction.WEST ->"西"
		
	

密封类 sealed 里面包含很多类,遇到太复杂的枚举(某个状态需要又个属性 ),则衍生出密封类

enum class Direction
	object EAST:Direction(),
	class WEST( val str:String):Direction();

class DD(var a:Direction)
	fun check():String
		retrun when(a)
			is Direction.EAST ->"东"
			is Direction.WEST ->"西$t(his.a as WEST).str"
		
	

17.接口(一般提供功能,90%只提供函数声明)

interface 默认open,实现使用overrided,默认实现

interface Movable
	val maxSpeed:Int
			get()=(1..500).shuffled().last()
	var wheels:Int
	fun move(movable:Movable):String

class Car(name:String,override var wheels:Int=4):Movable
	override var maxSpeed:Int
			get()=super.maxSpeed
			set(value)
	override fun move以上是关于Kotlin 全部基础的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 惰性集合操作-序列 Sequence

Kotlin函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

Kotlin函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

在不调用属性的情况下获取休眠惰性关系 n+1 - Kotlin

错误:惰性类的 Getter 不能是最终的 Kotlin Spring Boot

Kotlin 全部基础