首页 > 其他分享 >Kotlin

Kotlin

时间:2022-12-31 23:45:22浏览次数:33  
标签:val Kotlin list fun fruit println 构造函数

package com.example.test02

import kotlin.math.max

fun main(args: Array<String>) {
    val a = 10 // 常量Int
    var aa = 10L // 变量Long
    var b = "string" // 变量string

    // if 语句有返回值
    b = if (a > 5) {
        println(">")
        ">"
    } else {
        println("<")
        "<"
    }

    b = when(a) {
        1 -> "1"
        2 -> {
            print("")
            "2"
        }
        else -> "3"
    }

    b = when {
        a > 0 -> "1"
        a > 10 && a % 2==0 -> "2"
        else -> "3"
    }

    // 循环 while 和java中相同
    var range = 0..10 // IntRange 变量
    for (i in 1..10) {
        println(i)
    }
    for (i in 1 until 10 step 2) { // 左闭右开区间,每次递增2
        println(i)
    }
    // for (i in 10 downTo 1 step 2)  [10, 1]每次递增2

    println("Hello")
}

// 可使用默认参数,使用时可省略靠后的参数,也可指定传参
fun function(param1:Int = 0, param2: String = " ") {
    return
}
fun getMax(num1: Int, num2:Int) : Int = max(num1, num2)

fun getMax2(num1: Int, num2: Int) = if (num1 > num2) num1 else num2

fun checkNumber(num: Number) {
    when (num) {
        is Int -> println("Int")
        is Double -> {
            println("Double")
        }
        else -> println("else")
    }
}

/************************** 面向对象(注意,类似java,每个类一个文件) *****************************/
/*
 * Kotlin 中有 主构造函数 和 次构造函数
 * + 主构造函数
 *   类名后的圆括号,其中的字段名用于赋值。默认为空
 *   在创建下方Student时必须传入参数 `val stu = Student("a123", 5)`
 *   继承时必须通过 () 指定调用的构造方法
 * + 次构造函数
 *   类内部的 init 代码块
 *   当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)
 */
open class Clazz {
    var param1 = ""
    var param2 = 0

    fun info() {
        println("$param1 $param2")
    }
}
// 加上open后这个类才可以基础,默认不可以
open class Person(val name: String, val age: Int) {
    fun info() {
        println(name + " is " + age + "years old.")
    }
}
// Student 不可以被继承
// 构造时传入父类参数,再用于构造父类
// 主构造中传给父类的参数不能使用 var val,使用了就是自己的,不能传给父类
// 3种构造方法:
// val stu1 = Student()
// val stu2 = Student("123", 10)
// val stu3 = Student("123", 1, "123", 19)
class Student(val sno:String, val grade: Int, name: String, age: Int) : Person(name, age), Study {
    // 主构造函数的的函数体
    init {
        println("this is init function.")
    }
    // 次构造函数,必须调用主构造函数
    constructor(name: String, age: Int) : this("", 0, name, age) {

    }
    constructor() : this("", 0) {

    }

    override fun readBooks() {

    }
}
// 只有次构造函数,没有主构造函数
class Student2 : Person {
    constructor(name: String, age: Int) : super(name, age) {}
}
// 接口与java种几乎相同,类实现时使用 : 和继承一样
interface Study {
    fun readBooks()
    fun doHomework() {
        println("接口的默认实现")
    }
}

// 可见性修饰符有4种:public(默认)、private(当前类可见)、protected(当前类、子类可见)、internal(只对同一模块可见)

// 数据类,自动实现 equals() hashcode() toString() 等方法
data class Cellphone(val brand: String, val price: Double)

// 单例类
object Singleton {
    fun singletonTest() {
        println("singletonTest is called.")
    }
}

/****************************** Lambda ********************************/
// {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
fun f() {
    val list = ArrayList<String>()
    list.add("Apple")
    list.add("Banana")
    list.add("Orange")

    val list2 = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val list3 = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")

    val set = setOf("Apple", "Banana", "Orange", "Pear", "Grape")

    val map1 = HashMap<String, Int>()
    map1["Apple"] = 1
    map1["Banana"] = 2
    map1["Orange"] = 3
    map1["Pear"] = 4
    map1["Grape"] = 5

    val map2 = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
    for ((fruit, number) in map2) {
        println("fruit is $fruit, number is $number")
    }

    val maxLengthFruit1 = list.maxBy({ fruit: String -> fruit.length })
    val maxLengthFruit2 = list.maxBy() { fruit: String -> fruit.length }
    val maxLengthFruit3 = list.maxBy { fruit: String -> fruit.length }
    val maxLengthFruit4 = list.maxBy { it.length }

    val newList5 = list.map { it.uppercase() }
    val newList6 = list.filter { it.length <= 5 }.map { it.uppercase() }
    
    val anyResult : Boolean = list.any { it.length <= 5 } // 是否有长度大于5的
    val allResult : Boolean = list.all { it.length <= 5 } // 是否全部长度大于5
}

/*************************** 空指针 **************************/
// 可以直接用 == 比较类和string,不需要equal方法
// 利用编译时判空检查的机制几乎杜绝了空指针异常
// 空指针异常的检查提前到了编译时期,如果我们的程序存在空指针异常的风险,那么在编译的时候会直接报错,
//     修正之后才能成功运行,这样就可以保证程序在运行时期 不会出现空指针异常了。
fun f2() {
    doStudy(null) // 报错,无法编译
    doStudy2(null) // 正确
}
fun doStudy(study: Study) { // 此时无法传入 null
    study.readBooks()
    study.doHomework()
}
fun doStudy2(study: Study?) {
    if (study != null) {
        study.doHomework()
        study.readBooks()
    }
    study?.readBooks() // 省略了 if-null 判断
    var c = study ?: " " //  val c = if (study != null) {study} else {" "}
}
fun getTextLength(text: String) = text?.length ?: 0

 

/****************************** 标准函数 let with run apply*********************************/
/*
let 主要配合 ?. 使用
obj.let { obj2 ->
 // 编写具体的业务逻辑
}
obj 作为lambda的参数传入
*/
fun doStudy3(study: Study?) {
    study?.let {
        it.readBooks()
        it.doHomework()
    }
}

/*
val result = with(obj : 任意类型) { // lambda表达式
 // 这里是obj的上下文
 "value" // with函数的返回值
}
*/
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuilder()) {
    // 整个Lambda表达式的上下文就会是这个StringBuilder对象
    append("Start eating fruits.\n")
    for (fruit in list) {
        append(fruit).append("\n")
    }
    append("Ate all fruits.")
    toString()
}
println(result)

/*
与with类似
val result = obj.run {
 // 这里是obj的上下文
 "value" // run函数的返回值
}
 */
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().run {
    append("Start eating fruits.\n")
    for (fruit in list) {
        append(fruit).append("\n")
    }
    append("Ate all fruits.")
    toString()
}
println(result)


/*
与run类似apply函数无法指定返回值,而是会自动返回调用对象本身
val result = obj.apply {
 // 这里是obj的上下文
}
// result == obj
 */
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().apply {
    append("Start eating fruits.\n")
    for (fruit in list) {
        append(fruit).append("\n")
    }
    append("Ate all fruits.")
}
println(result.toString())


/******************************* 定义静态方法 ****************************/
/*
1. @JvmStatic 注解
2. 顶层方法:那些没有定义在任何类中的方法,比如 main() 方法。
   顶层方法在kotlin中直接调用即可,无需包名、路径
   java调用时要使用 文件名.顶层方法() 调用,编译器自动生成一个与文件名同名的类
 */
class Util {
    fun doAction1() {
        println("do action1")
    }
    companion object {
        @JvmStatic // 只能加在单例类或companion object中的方法上
        fun doAction2() {
            println("do action2")
        }
    }
}
// Util.doAction2() 调用

 

标签:val,Kotlin,list,fun,fruit,println,构造函数
From: https://www.cnblogs.com/zhh567/p/17017585.html

相关文章

  • 第二章 探究新语言,快速入门Kotlin编程
    第二章探究新语言,快速入门Kotlin编程2.1Kotlin简介略2.2如何运行Kotlin代码(1)打开HelloWorld项目,找到MainActivity所在的位置(2)在MainActivity的同级包结构下创建一......
  • 使用 Spring Boot 和 Kotlin 构建 Web 应用程序
    本教程向您展示如何通过结合弹簧启动和科特林.如果您从Kotlin开始,您可以通过阅读参考文档,跟随在线KotlinKoans教程或只是使用Spring框架参考文档现在在Kotlin中提供......
  • 干货来袭,推荐几款开源的Kotlin的Android项目
    GoogleIO大会,谷歌宣布,将Kotlin语言作为安卓开发的一级编程语言。刷新Android的各大论坛,朋友圈,微信群。是时候总结一波Kotlin的Android项目了!废话不多说,直接上项目,别忘了st......
  • Kotlin 技术书籍集锦-推荐
    Kotlin技术书籍推荐国内中文书籍:《Kotlin极简教程》编辑推荐本书由阿里Java程序员撰写,带你快速进入Kotlin世界。本书基于Kotlin1.1版本,从Kotlin基础知识到动手实战,包含了......
  • Google Guava 工具类与 Kotlin 语言的设计
    GoogleGuava工具类与Kotlin语言的设计Guava工具类是什么Guavaisasuiteofcoreandexpandedlibrariesthatincludeutilityclasses,google'scollections,ioc......
  • 是时候使用Kotlin编程了
    从事Android开发的童鞋都知道,自从去年的GoogleI/O大会上Kotlin被定为Android开发的官方语言以来,关于Kotlin就成为每个开发人员学习的目标,的确,Kotlin以它独有的魅力正在吸引......
  • go-zero一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可
    go-zero是一个集成了各种工程实践的web和rpc框架。通过弹性设计保障了大并发服务端的稳定性,并经受了充分的实战检验(好未来-晓黑板)。go-zero包含极简的API定义......
  • Kotlin学习快速入门(12)—— 位运算符
    由于不懂pythod,最近拜托朋友研究下解密live2d模型的解密算法,朋友写出了Java的代码之后我进行改版,在转为kotlin的时候,发现kotlin自动转换有些坑,以及kotlin中的位运算......
  • 初步尝试kotlin
    今日科技快讯近日有消息称:为了确保在苹果iPhone上的默认搜索引擎地位,谷歌今年要向苹果支付30十亿美元费用,而3年前仅为10亿美元,与此同时,苹果的iOS设备贡献了大约50%的谷歌移......
  • Kotlin 异步框架 Ktor 2023 路线图公布
    Kotlin异步框架Ktor2023路线图公布来源:OSCHINA编辑: Alias_Travis2022-12-1907:58:46 0Ktor是一个异步框架,用于创建微服务、Web应用等。从头到......