Kotlin学习——hello kotlin & 函数function & 变量 & 类 + 泛型 + 继承

在这里插入图片描述

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

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

引出


1.kotlin初识;
2.function函数,变量,null;
3.泛型,接口,继承,超类;

hello

在这里插入图片描述

package com.tianju.ktLearn


fun main() {                        // 2
    println("Hello, World!")        // 3
}

function函数

  • 返回值为Unit,表示没有返回值, 类似与java里面的 void
  • Unit可以省略不写,可以传两个参数,参数带有默认值

在这里插入图片描述

package com.tianju.ktLearn

// 返回值为Unit,表示没有返回值, 类似与java里面的 void
fun printMsg(msg: String): Unit {
    println(msg)
}

// Unit可以省略不写,可以传两个参数,参数带有默认值
fun printMsgWithPrefix(msg: String, prefix:String = "info") {
    println("[wtt--$prefix] $msg")
}

fun sum(x: Int, y: Int): Int {
    return x+y;
}

fun multiply(x: Int,y: Int) = x*y

fun main() {
    printMsg("Pet!")
    // 可以不传参,带有默认参数的
    printMsgWithPrefix("Hello")
    printMsgWithPrefix("Hello","Peter")
    printMsgWithPrefix(prefix = "MMDD", msg = "HTTP")
    val sum = sum(100, 300)
    println(sum)
    println(multiply(3,30))
}

Infix Functions 中缀函数

具有单个参数的成员函数和扩展可以转换为中缀函数。

在这里插入图片描述

package com.tianju.ktLearn;

// 具有单个参数的成员函数和扩展可以转换为中缀函数
fun main(){
        infix fun Int.times(str: String) = str.repeat(this)
        println(2 times "Hei!")


        // to 是标准库中的函数 kotlin.Pair<A, B>
        val  pair = "WHTT" to "PPTS"
        println(pair)

        // 自定义一个 onto 函数
        infix fun String.onto(str: String) = Pair(this,str)
        val myPair = "MVC" onto "WWW"
        println(myPair)

        val pet = Person("peter",34)
        val Shi = Person("Shirley",30)
        pet likes Shi
        println(pet.people[0])
}

class Person(val name: String,val year: Int){

        val people = mutableListOf<Person>()
        infix fun likes(person: Person){
                people.add(person)
        }

}

Operator Functions 算术函数

Certain functions can be “upgraded” to operators, allowing their calls with the corresponding operator symbol.

在这里插入图片描述

package com.tianju.ktLearn

// 符号times 就是 下面的 乘号 *
operator fun Int.times(str:String) = str.repeat(this)

fun main() {
    println(2 * "Bye")
    val str = "Always forgive your enemies; nothing annoys them so much."
    operator fun String.get(range: IntRange) = substring(range)
    println(str[0..14])
}

变长参数vararg Parameters

在这里插入图片描述

package com.tianju.ktLearn

fun printAll(vararg msgs: String) {
    for (msg in msgs){
        println(msg)
    }
}

fun printWithPre(vararg msgs: String, prefix:String): Unit {
    for (msg in msgs) println("[嘻嘻嘻--$prefix]$msg")
}

fun logs(vararg msgs:String){
    printAll(*msgs)
}

fun main() {
    printAll("pet","sh","wt")
    printWithPre("pet","sh","wt", prefix ="Hi")
    logs("sh","wtt","abc")

}

变量

Kotlin具有强大的类型推理能力。虽然你可以显式地声明变量的类型,但你通常会让编译器通过推断来完成这项工作。Kotlin不强制执行不变性,但建议这样做。本质上使用val而不是var。

val b: Int = 1             // 2
val c = 3                  // 3

声明一个不可变变量并对其进行初始化。

声明一个不可变变量并在不指定类型的情况下对其进行初始化。编译器推断类型Int。

kt中的null

  • 在kt里面,如果有一个可以为null,需要在类型后面加上 问号 ?
  • 函数只能传入不为null的值
  • 参数类型后面加个 ? 问号后,传入的值可以为null

在这里插入图片描述

在这里插入图片描述

package com.tianju.ktLearn


fun main() {
    var neverNull : String = "never Null"
    // neverNull = null
    println(neverNull)

    // 在kt里面,如果有一个可以为null,需要在类型后面加上 问号 ?
    var nullable:String? = "can be null"
    nullable = null
    println(nullable)
    fun strLength(notNull:String ): Int {
        return notNull.length
    }

    // 函数只能传入不为null的值
    strLength(neverNull)
//    strLength(nullable) // 爆红

    val str = descStr(null)
    println(str)

    println(descStr("hello are you ok?"))
}

/**
 * 返回值为String,
 * 参数类型后面加个 ? 问号后,传入的值可以为null
 */
fun descStr(maybeStr: String?): String {
    if (maybeStr !=null && maybeStr.length>0){
        return "StrLength is ${maybeStr.length}"
    }
    return "null"
}

kt中的类

  • 在kt里面没有 new 关键字

在这里插入图片描述

泛型 Generics

在这里插入图片描述

package com.tianju.ktLearn

/**
 * 可以输入多个参数 vararg
 * <E> 泛型
 */
class MutableStack<E>(vararg items: E) {              // 1

    private val elements = items.toMutableList()

    fun push(element: E) = elements.add(element)        // 2

    // 偷看一下
    fun peek(): E = elements.last()                     // 3

    // 弹出栈顶元素
    fun pop(): E = elements.removeAt(elements.size - 1)

    fun isEmpty() = elements.isEmpty()

    fun size() = elements.size

    override fun toString() = "MutableStack(${elements.joinToString()})"
}

fun main() {
    val mut = MutableStack<String>("hello","pet")
    println("is mut empty?---> " + mut.isEmpty())
    print(mut)
    mut.push("wtt")
    println(mut)
    mut.peek()
    println(mut)
    val pop = mut.pop()
    println(pop)
    println(mut)
    println("is mut empty?---> " + mut.isEmpty())
}

在这里插入图片描述

泛型函数Generic Functions

如果函数的逻辑独立于特定类型,则也可以生成函数。例如,您可以编写一个实用程序函数来创建可变堆栈:

在这里插入图片描述

继承Inheritance

在这里插入图片描述

在这里插入图片描述

超类Asiatic

在这里插入图片描述

在这里插入图片描述

package com.tianju.ktLearn

/**
 * open 关键字就表示是接口 interface
 */
open class Dog{
    open fun fake(){
        println("wow wow !")
    }
}

class YourDog : Dog(){
    override fun fake() {
        println("miao wu ,wow")
    }
}

/**
 * 带参数的接口
 * interface with par
 */
open class Cat(val name: String){
    fun sayHello(){
        println("A cat name is [$name] say hello")
    }
}

class Arya : Cat("Arya")

/**
 * 超类 :将构造函数参数传递给超类
 */
open class Lion(val name:String,val age: Int){
    fun sayHello(){
        println("hi, every one, my name is $name, age is $age")
    }
}

/**
 * Asiatic声明中的name既不是var也不是val:它是一个构造函数参数
 */
class Asiatic(name: String) : Lion(name = name, age = 18)


fun main() {
    val dog = YourDog()
    dog.fake()

    val cat : Cat = Arya()
    cat.sayHello()
    println(cat.name)

    val lion: Lion = Asiatic("Peter")
    lion.sayHello()
}

总结

1.kotlin初识;
2.function函数,变量,null;
3.泛型,接口,继承,超类;

  • 21
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kotlin + 协程 + Retrofit + MVVM 是一种非常优雅的方式来实现网络请求。下面是一个简单的示例: 首先,我们需要添加相关依赖库: ```gradle // Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9' // Retrofit2 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // ViewModel和LiveData implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0' ``` 接下来,我们创建一个数据来表示网络请求返回的数据: ```kotlin data class Response<T>( val code: Int, val msg: String, val data: T? ) ``` 然后,我们创建一个接口来描述我们的API: ```kotlin interface ApiService { @GET("api/get_data") suspend fun getData(): Response<List<String>> } ``` 注意,我们在这里使用了 `suspend` 关键字来表示这个方法是一个挂起函数。 接下来,我们创建一个 `ApiService` 的实例: ```kotlin val retrofit = Retrofit.Builder() .baseUrl("https://example.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val api = retrofit.create(ApiService::class.java) ``` 现在,我们可以在我们的 ViewModel 中使用这个 `api` 对象来进行网络请求了: ```kotlin class MyViewModel : ViewModel() { private val _data = MutableLiveData<List<String>>() val data: LiveData<List<String>> = _data fun loadData() { viewModelScope.launch { val response = api.getData() if (response.code == 200) { _data.value = response.data } } } } ``` 在这里,我们使用了 `viewModelScope` 来启动一个协程来进行网络请求。如果请求成功,我们就将数据传递给 `_data` 变量,它是一个 LiveData 对象。 最后,我们可以在我们的 Activity 或 Fragment 中观察 `data` 变量来获取网络请求返回的数据: ```kotlin class MyActivity : AppCompatActivity() { private val viewModel by viewModels<MyViewModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my) viewModel.data.observe(this, Observer { data -> // 在这里更新UI }) viewModel.loadData() } } ``` 这样,我们就使用 Kotlin + 协程 + Retrofit + MVVM 实现了一个优雅的网络请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Perley620

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值