Kotlin学习教程(八)

Android快速转战Kotlin教程 前言 kotlin是啥?这里就不用多说了,想必看这篇文章的童鞋肯定是有所了解的。 那么这篇文章你可以收获什么? 答:本文主要通过本人如何从java转战到kotlin并应用在实际项目中的个人经历,给大家提供一些学习思路、学习方法以及一些学习资料和个人总结。 前提:你的项目(包含个人项目)即将开始用到kotlin(没有项目作为依托你会缺少十足的动力,而且缺少应用场景乘热打铁那也是白学) 建议:建议... 阅读详情

Kotlin学习教程(八)

Kotlin协程

一些API启动长时间运行的操作(例如网络IO、文件IO、CPU或GPU密集型任务等),并要求调用者阻塞直到它们完成。协程提供了一种避免阻塞线程
并用更廉价、更可控的操作替代线程阻塞的方法:协程挂起。
协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、
订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。

阻塞 vs 挂起

基本上,协程计算可以被挂起而无需阻塞线程。线程阻塞的代价通常是昂贵的,尤其在高负载时,因为只有相对少量线程实际可用,因此阻塞其中一个会导致一些
重要的任务被延迟。

另一方面,协程挂起几乎是无代价的。不需要上下文切换或者OS的任何其他干预。最重要的是,挂起可以在很大程度上由用户库控制:
作为库的作者,我们可以决定挂起时发生什么并根据需求优化/记日志/截获。

另一个区别是,协程不能在随机的指令中挂起,而只能在所谓的挂起点挂起,这会调用特别标记的函数。

挂起函数

当我们调用标记有特殊修饰符suspend的函数时,会发生挂起:

suspend fun doSomething(foo: Foo): Bar {
    ……
}

这样的函数称为挂起函数,因为调用它们可能挂起协程(如果相关调用的结果已经可用,库可以决定继续进行而不挂起)。挂起函数能够以与普通函数相同的方式
获取参数和返回值,但它们只能从协程和其他挂起函数中调用。事实上,要启动协程,
必须至少有一个挂起函数,它通常是匿名的(即它是一个挂起lambda表达式)。让我们来看一个例子,一个简化的async()函数
(源自kotlinx.coroutines库):

fun <T> async(block: suspend () -> T)

这里的async()是一个普通函数(不是挂起函数),但是它的block参数具有一个带suspend修饰符的函数类型:suspend() -> T。
所以,当我们将一个lambda表达式传给async()时,它会是挂起lambda表达式,于是我们可以从中调用挂起函数:

async {
    doSomething(foo)
    ……
}

继续该类比,await()可以是一个挂起函数(因此也可以在一个async {}块中调用),该函数挂起一个协程,直到一些计算完成并返回其结果:

async {
    ……
    val result = computation.await()
    ……
}

更多关于async/await函数实际在kotlinx.coroutines中如何工作的信息可以在这里找到。

请注意,挂起函数await()和doSomething()不能在像main()这样的普通函数中调用:

fun main(args: Array<String>) {
    doSomething() // 错误:挂起函数从非协程上下文调用
}

还要注意的是,挂起函数可以是虚拟的,当覆盖它们时,必须指定suspend修饰符:

interface Base {
    suspend fun foo()
}

class Derived: Base {
    override suspend fun foo() { …… }
}

Kotlin解构声明

有时把一个对象解构成很多变量会很方便:

val (name, age) = person

这种语法称为解构声明。 一个解构声明可以同时创建多个变量。

我们已经声明了两个新变量:name和age,并且可以独立使用它们:

println(name)
println(age)

一个解构声明会被编译成以下代码:

val name = person.component1()
val age = person.component2()

其中的component1()和component2()函数是在Kotlin中广泛使用的约定原则的另一个例子。

任何表达式都可以出现在解构声明的右侧,只要可以对它调用所需数量的component函数即可。
当然,可以有component3()和component4()等等。

请注意,componentN()函数需要用operator关键字标记,以允许在解构声明中使用它们。

解构声明也可以用在for{: .keyword }循环中:

for ((a, b) in collection) { …… }

变量a和b的值取自对集合中的元素上调用component1()和component2()的返回值。

例:从函数中返回两个变量
让我们假设我们需要从一个函数返回两个东西。例如,一个结果对象和一个某种状态。
在Kotlin中一个简洁的实现方式是声明一个数据类并返回其实例:

data class Result(val result: Int, val status: Status)
fun function(……): Result {
    // 各种计算
    return Result(result, status)
}
// 现在,使用该函数:
val (result, status) = function(……)

因为数据类自动声明componentN()函数,所以这里可以用解构声明。

注意:我们也可以使用标准类Pair并且让function()返回Pair<Int, Status>,
但是让数据合理命名通常更好。

例:解构声明和映射
可能遍历一个映射(map)最好的方式就是这样:

for ((key, value) in map) {
   // 使用该 key、value 做些事情
}

为使其能用,我们应该
通过提供一个iterator()函数将映射表示为一个值的序列,
通过提供函数component1()和component2()来将每个元素呈现为一对。
当然事实上,标准库提供了这样的扩展:

operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()

因此你可以在for{: .keyword }-循环中对映射(以及数据类实例的集合等)自由使用解构声明。

Kotlin反射

最基本的反射功能是获取Kotlin类的运行时引用。要获取对
静态已知的Kotlin类的引用,可以使用类字面值语法:

val c = KClass::class

该引用是KClass类型的值。

请注意,Kotlin类引用与Java类引用不同。要获得Java类引用,
请在KClass实例上使用.java属性,也就是KClass::class.java

函数引用

当我们有一个命名函数声明如下:

fun isOdd(x: Int) = x % 2 != 0

我们可以很容易地直接调用它(isOdd(5)),但是我们也可以把它作为一个值传递。例如传给另一个函数。
为此,我们使用::操作符:

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // 输出 [1, 3]

这里::isOdd是函数类型(Int) -> Boolean的一个值。

当上下文中已知函数期望的类型时::可以用于重载函数。

例如:

fun isOdd(x: Int) = x % 2 != 0
fun isOdd(s: String) = s == "brillig" || s == "slithy" || s == "tove"

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // 引用到 isOdd(x: Int)

或者,你可以通过将方法引用存储在具有显式指定类型的变量中来提供必要的上下文:

val predicate: (String) -> Boolean = ::isOdd   // 引用到 isOdd(x: String)

如果我们需要使用类的成员函数或扩展函数,它需要是限定的。
例如String::toCharArray为类型String提供了一个扩展函数:String.() -> CharArray。

属性引用

要把属性作为Kotlin中的一等对象来访问,我们也可以使用::运算符:

var x = 1

fun main(args: Array<String>) {
    println(::x.get()) // 输出 "1"
    ::x.set(2)
    println(x)         // 输出 "2"
}

表达式::x求值为KProperty<Int>类型的属性对象,它允许我们使用
get()读取它的值,或者使用name属性来获取属性名。更多信息请参见
关于KProperty类的文档。

对于可变属性,例如var y = 1,::y返回KMutableProperty<Int>类型的一个值,
该类型有一个set()方法。

属性引用可以用在不需要参数的函数处:

val strs = listOf("a", "bc", "def")
println(strs.map(String::length)) // 输出 [1, 2, 3]

要访问属于类的成员的属性,我们这样限定它:

class A(val p: Int)

fun main(args: Array<String>) {
    val prop = A::p
    println(prop.get(A(1))) // 输出 "1"
}

Kotlin类型别名

类型别名为现有类型提供替代名称。
如果类型名称太长,你可以另外引入较短的名称,并使用新的名称替代原类型名。

它有助于缩短较长的泛型类型。
例如,通常缩减集合类型是很有吸引力的:

typealias NodeSet = Set<Network.Node>

typealias FileTable<K> = MutableMap<K, MutableList<File>>

你可以为函数类型提供另外的别名:

typealias MyHandler = (Int, String, Any) -> Unit

typealias Predicate<T> = (T) -> Boolean

你可以为内部类和嵌套类创建新名称:

class A {
    inner class Inner
}
class B {
    inner class Inner
}

typealias AInner = A.Inner
typealias BInner = B.Inner

类型别名不会引入新类型。
它们等效于相应的底层类型。
当你在代码中添加typealias Predicate<T>并使用Predicate<Int>时,Kotlin编译器总是把它扩展为(Int) -> Boolean。
因此,当你需要泛型函数类型时,你可以传递该类型的变量,反之亦然:

typealias Predicate<T> = (T) -> Boolean

fun foo(p: Predicate<Int>) = p(42)

fun main(args: Array<String>) {
    val f: (Int) -> Boolean = { it > 0 }
    println(foo(f)) // 输出 "true"

    val p: Predicate<Int> = { it > 0 }
    println(listOf(1, -2).filter(p)) // 输出 "[1]"
}

文档

用来编写Kotlin代码文档的语言(相当于Java的JavaDoc)称为KDoc。本质上KDoc是将JavaDoc的块标签(block tags)语法(
扩展为支持Kotlin的特定构造)和Markdown的内联标记(inline markup)结合在一起。

生成文档

Kotlin的文档生成工具称为Dokka。

Dokka有Gradle、Maven和Ant的插件,因此你可以将文档生成集成到你的构建过程中。

像JavaDoc一样,KDoc注释也以/**开头、以*/结尾。注释的每一行可以以
星号开头,该星号不会当作注释内容的一部分。

按惯例来说,文档文本的第一段(到第一行空白行结束)是该元素的
总体描述,接下来的注释是详细描述。

每个块标签都以一个新行开始且以@字符开头。

以下是使用KDoc编写类文档的一个示例:

/**
 * 一组*成员*。
 *
 * 这个类没有有用的逻辑; 它只是一个文档示例。
 *
 * @param T 这个组中的成员的类型。
 * @property name 这个组的名称。
 * @constructor 创建一个空组。
 */
class Group<T>(val name: String) {
    /**
     * 将 [member] 添加到这个组。
     * @return 这个组的新大小。
     */
    fun add(member: T): Int { …… }
}

KDoc目前支持以下块标签(block tags):

  • @param <名称>

    用于函数的值参数或者类、属性或函数的类型参数。
    为了更好地将参数名称与描述分开,如果你愿意,可以将参数的名称括在
    方括号中。因此,以下两种语法是等效的:

    @param name 描述。
    @param[name] 描述。
  • @return

    用于函数的返回值。

  • @constructor

    用于类的主构造函数。

  • @receiver

    用于扩展函数的接收者。

  • @property <名称>

    用于类中具有指定名称的属性。这个标签可用于在
    主构造函数中声明的属性,当然直接在属性定义的前面放置doc注释会很别扭。

  • @throws <类>,@exception <类>

    用于方法可能抛出的异常。因为Kotlin没有受检异常,所以也没有期望所有可能的异常都写文档,但是当它会为类的用户提供有用的信息时,仍然可以使用这个标签。

  • @sample <标识符>

    将具有指定限定的名称的函数的主体嵌入到当前元素的文档中,以显示如何使用该元素的示例。

  • @see <标识符>

    将到指定类或方法的链接添加到文档的另请参见块。

  • @author

    指定要编写文档的元素的作者。

  • @since

    指定要编写文档的元素引入时的软件版本。

  • @suppress

    从生成的文档中排除元素。可用于不是模块的官方API的一部分但还是必须在对外可见的元素。

KDoc不支持@deprecated这个标签。作为替代,请使用@Deprecated注解。

内联标记

对于内联标记,KDoc使用常规Markdown语法,扩展了支持用于链接到代码中其他元素的简写语法。

链接到元素
要链接到另一个元素(类、方法、属性或参数),只需将其名称放在方括号中:

为此目的,请使用方法 [foo]。

如果要为链接指定自定义标签(label),请使用 Markdown 引用样式语法:

为此目的,请使用[这个方法][foo]。

你还可以在链接中使用限定的名称。请注意,与 JavaDoc 不同,限定的名称总是使用点字符
来分隔组件,即使在方法名称之前:

使用 [kotlin.reflect.KClass.properties] 来枚举类的属性。

链接中的名称与正写文档的元素内使用该名称使用相同的规则解析。
特别是,这意味着如果你已将名称导入当前文件,那么当你在KDoc注释中使用它时,
不需要再对其进行完整限定。

请注意KDoc没有用于解析链接中的重载成员的任何语法。因为Kotlin文档生成
工具将一个函数的所有重载的文档放在同一页面上,标识一个特定的重载函数
并不是链接生效所必需的。

常用操作符及函数

let操作符

如果对象的值不为空,则允许执行这个方法。返回值是函数里面最后一行,或者指定return

private var test: String? = null

private fun switchFragment(position: Int) {
    test?.let {
        LogUtil.e("@@@", "test is not null")
    }
}    

说到可能有人会觉得没什么用,用if判断下是不是空不就完了.

private var test: String? = null

private fun switchFragment(position: Int) {
//        test?.let {
//            LogUtil.e("@@@", "test is null")
//        }

    if (test == null) {
        LogUtil.e("@@@", "test is null")
    } else {
        LogUtil.e("@@@", "test is not null ${test}")
        check(test) // 报错
    }
}    

但是会报错:Smart cast to 'String' is impossible, beacuase 'test' is a mutable property that could have been changed by this time

sNullOrEmpty | isNullOrBlank
public inline fun CharSequence?.isNullOrEmpty(): Boolean = this == null || this.length == 0

public inline fun CharSequence?.isNullOrBlank(): Boolean = this == null || this.isBlank()

// If we do not care about the possibility of only spaces...
if (number.isNullOrEmpty()) {
    // alert the user to fill in their number!
}

// when we need to block the user from inputting only spaces
if (name.isNullOrBlank()) {
    // alert the user to fill in their name!
}
with函数

with是一个非常有用的函数,它包含在Kotlin的标准库中。它接收一个对象和一个扩展函数作为它的参数,然后使这个对象扩展这个函数。
这表示所有我们在括号中编写的代码都是作为对象(第一个参数)的一个扩展函数,我们可以就像作为this一样使用所有它的public方法和属性。
当我们针对同一个对象做很多操作的时候这个非常有利于简化代码。

fun testWith() {
    with(ArrayList<String>()) {
        add("testWith")
        add("testWith")
        add("testWith")
        println("this = " + this)
    }
}
// 运行结果
// this = [testWith, testWith, testWith]
repeat函数

repeat函数是一个单独的函数,定义如下:

/**
 * Executes the given function [action] specified number of [times].
 *
 * A zero-based index of current iteration is passed as a parameter to [action].
 */
@kotlin.internal.InlineOnly
public inline fun repeat(times: Int, action: (Int) -> Unit) {
    contract { callsInPlace(action) }

    for (index in 0..times - 1) {
        action(index)
    }
}

通过代码很容易理解,就是循环执行多少次block中内容。

fun main(args: Array<String>) {
    repeat(3) {
        println("Hello world")
    }
}

运行结果是:

Hello world
Hello world
Hello world
apply函数

apply函数是这样的,调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象

fun testApply() {
    ArrayList<String>().apply {
        add("testApply")
        add("testApply")
        add("testApply")
        println("this = " + this)
    }.let { println(it) }
}

// 运行结果
// this = [testApply, testApply, testApply]
// [testApply, testApply, testApply]

run函数和apply函数很像,只不过run函数是使用最后一行的返回,apply返回当前自己的对象。


更多文章请查看AndroidNote

你的star是我的动力!!!

Kotlin语言的学习路线 学习Kotlin是一段令人兴奋的旅程,通过持续的实践与探索,你将掌握这门强大的语言。欢迎利用网络资源、开源项目和社区互动,不断提高自己的技能。希望本文提供的学习路线能够帮助你在Kotlin语言的学习中建立清晰的方向,成为一名优秀的Kotlin开发者。 阅读详情

相关推荐

Kotlin 安装使用教程

Kotlin是由JetBrains开发的现代静态编程语言,完全兼容Java,适用于Android开发、后端服务等场景。本文介绍了Kotlin的多种安装方式,包括通过IntelliJ IDEA、Android Studio以及命令行工具,并展示了如何创建和运行第一个Kotlin程序("Hello, Kotlin!")。文章还提供了Kotlin REPL交互模式、Gradle项目配置以及基础语法示例,解答了常见兼容性问题,并推荐了官方文档等学习资源。全文可作为Kotlin入门指南,帮助开发者

真正的大师永远怀着一颗学徒的心 1725

Kotlin -- 一文详解Kotlin文档

1.介绍Kotlin文档中常用的标签 2.介绍Kotlin与Java文档中的部分区别 3.通过实验收集Markdown在Kotlin中的使用情况

opLW的博客 4241

掌握Kotlin编程语言:注释和数据类型详解

本文深入探讨了Kotlin编程语言中的注释和数据类型两大核心主题。首先,介绍了Kotlin多行注释的使用方法,然后详细解释了KDoc注释语法,包括如何利用它来为函数添加文档说明,以提高代码的可读性和易用性。接着,文章转向Kotlin的数据类型,阐释了不同数据类型的概念及其在编程中的重要性,举例说明了如何在Kotlin中声明和使用各种数据类型,并提供了实践练习以加深理解。

weixin_33068055的博客 396

kotlin杂谈系列五

Kotlin杂谈系列五

Pandaer杂货铺 595

【自然语言处理(NLP)实战】LSTM网络实现中文文本情感分析(手把手与教学超详细)

在当今数字化时代,人们在社交媒体、评论平台以及各类在线交流中产生了海量的文本数据。这些数据蕴含着丰富的情感信息,从而成为了深入理解用户态度、市场趋势,甚至社会情绪的宝贵资源。自然语言处理(NLP)的发展为我们提供了强大的工具,使得对文本情感进行分析成为可能。在这个领域中,长短时记忆网络(LSTM)凭借其能够捕捉文本序列中长距离依赖关系的能力,成为了情感分析任务中的一项重要技术。通过详细的步骤和示例代码,深入了解如何处理中文文本数据、构建LSTM模型、进行训练和评估。

halo的博客 2万+

手把手教你用Sentinel-1和SNAP处理InSAR数据:从下载到生成沉降图(附Python脚本)

本文详细介绍了如何使用Sentinel-1数据和SNAP软件处理InSAR数据,从下载到生成地表沉降图的全流程。通过Python脚本实现自动化处理,适用于城市扩张和地质脆弱带的地表沉降监测,提供高性价比的毫米级形变监测方案。

weixin_26800111的博客 265

一款IntelliJ IDEA的插件,帮助java\kotlin开发者自动生成javadoc\kdoc文档注释(带私活源码)

简化 Java 代码文档生成,轻松使用 easy_javadoc

m0_68103752的博客 1933

App inventor2通过蓝牙控制Arduino Uno LED开关

App inventer2控制Arduino Uno LED开关 如果学会这个小程序,大部分的手机通过蓝牙控制Arduino的功能都可以实现,这个小示例是通过蓝牙模块向Arduino发送"0"和"1",而其它功能要发送其它不同的字符串内容给Arduino. 所需硬件: Arduino Uno JDY-16 蓝牙模块(我的是蓝牙4.2版本) 草帽LED(可选) 手机(我用的是安卓,苹果手机应该也可以,最近其应用商店也有App inventor(AI)伴侣) 软件: Aduino IDE或者Platfom

Firmin123456的博客 5498

Smart cast to is impossible, because is a mutable property that could have been changed by this time

例如我当前在调用如下方法时候报错,解决方法有两种 lifecycle.addObserver(lifeMc) 解决方法一:重新定义对象类型,但是要确保类型正确 lifeMc as LifeChronometer 解决方法二:延迟加载,不初始化值 ...

tiannuo1993的博客 1741

调用IP核、移植/复制IP核以及解决IP核被锁住/红锁问题(基于vivado)

解决不同工程IP核之间复制调用以及IP核红锁问题,让开发更简单!

weixin_44502554的博客 1万+

新手必看:如何用T265和ROS实现无人机室内精准定位(附PX4参数配置)

本文详细介绍了如何使用Intel Realsense T265和ROS实现无人机室内精准定位,包括硬件准备、ROS数据流架构设计、PX4参数配置及系统验证。特别针对视觉SLAM技术在室内环境中的应用,提供了从零搭建到进阶优化的全流程解析,适合无人机开发新手快速上手。

weixin_30642561的博客 404

学习Kotlin(八)其他技术

    推荐阅读:学习Kotlin(一)为什么使用Kotlin学习Kotlin(二)基本语法学习Kotlin(三)类和接口学习Kotlin(四)对象与泛型学习Kotlin(五)函数与Lambda表达式学习Kotlin(六)扩展与委托学习Kotlin(七)反射和注解学习Kotlin(八)其他技术Kotlin学习资料总汇   目录 一、解构声明 二、区间 三、类型检查与转换 四、this表达...

lt的博客 706

AIPex:AI + 自然语言驱动的浏览器自动化扩展

AIPex是一款革命性的Chrome扩展,通过AI技术实现自然语言驱动的浏览器自动化。它支持30多种自动化工具,包括智能标签页管理(分组、切换、批量操作)、页面内容提取(文本、链接、元数据)、交互元素操作(点击、滚动)以及表单智能填写等功能。用户只需用自然语言下达指令,即可快速完成复杂的浏览器操作,大幅提升工作效率。AIPex特别适合需要处理大量重复性网页操作的用户,如数据分析师、产品经理等。

blues_C的博客 1126

Kotlin学习教程(一)

class) {如果你没有指定它的返回值,它就会返回Unit与Java中的void类似,但是Unit是一个真正的对象。Unit可以省略,return a} else {return b我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来Toast上面代码中第二个参数length指定了一个默认值。get set。

yundashi168.com 2438

手把手教你学 MATLAB 实战训练(6.5):基础实战实例

MATLAB 是一款强大的数学软件,广泛应用于工程计算、信号处理、控制系统设计、图像处理等领域。学习 MATLAB 不仅可以提高你的编程技能,还能帮助你解决实际的数学和工程问题。下面我将通过几个实战训练实例来教你如何使用 MATLAB。

xiaoheshang_123的博客 366

【扣子AI开发】如何开发一个图像生成智能体?

【扣子AI开发】如何开发一个图像生成智能体,从创建到发布

tl437002770的博客 2427

Kotlin入门学习,从零基础入门到精通 ,Kotlin超详细教程

章节目录 Kotlin语言简介与环境搭建 Kotlin语法基础 Kotlin类型系统与空值处理 Kotlin函数与Lambda表达式 Kotlin类与对象 Kotlin集合与迭代器 Kotlin协程与异步编程 Kotlin与Android开发 Kotlin扩展功能与高阶函数 Kotlin工具与构建系统 1. Kotlin语言简介与环境搭建 重点详细内容知识点总结 Kotlin简介:Kotlin是一种在Java虚拟机(JVM)上运行的静态类型编程语言,由JetBrains公司开发,旨在简化Java代码

weixin_56510835的博客 1579

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Kotlin 资源大全 - 学 Kotlin 看这一篇教程就够了

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我。

2401_84167125的博客 975

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Kotlin教程(九)泛型

写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kotlin的同学。系列文章的知识点会以《Kotlin实战》这本书中顺序编写,在将书中知识点展示出来同时,我也会添加对应的Java代码用于对比学习和更好的理解。

ZL_1618的博客 1908

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Kotlin教程,从入门到精通

前言 Kotlin现在已经更新至1.3. 后续,也将以1.3版本进行讲解。 围绕 What(是什么)、How(怎么用)、Difference(与java的区别)、Intent(意图是什么)四个方面来阐述。 产物:Kotlin整理后的Xmind(更新在github上) 目录结构 [基础篇] 基本类型 ...

王学明 2100

【教程】Kotlin语言学习笔记(一)——认识Kotlin

Kotlin语言学习第一部分

EliasChang的博客 1766

Kotlin学习之路

开始学习Kotlin 之前大学的时候写程序什么用的几乎都是C++和Qt框架,近来准备找工作了,目前选定了Android开发的方向,大部分公司需要的是基于Java的Android开发,而少数公司(一般都是大公司)的招聘条件里会写着Kotlin优先、Flutter优先等。在经过一番考虑后,我决定先学习Kotlin与基于Kotlin的Android开发,之后再去了解Java的一些基础。 学习过程 整个学习过程大约为2个月的时间 了解基本的Kotlin语法,以便能够开始Android开发训练。(因为有C++的基础

qq_36980354的博客 331

八、Kotlin 反射

反射是允许在运行时期访问程序结构的一类特性(程序结构包括:类、接口、方法、属性等)。

zengkaiqiang562的博客 1596

Kotlin教程:Kotlin入门

正如我在文章“ 什么是Kotlin? Java替代方案解释说 ,“ Kotlin是一种通用的,开源的,静态类型化的“实用”编程语言,结合了面向对象和功能性编程功能。 您可以使用Kotlin为Java虚拟机(JVM),Android,浏览器以及MacOS,Linux,Windows,iOS,WebAssembly和Android上的本机应用程序构建应用程序。 Kotlin由JetBrains创建...

cxu0262的博客 2667

Kotlin学习笔记八、Kotlin简单控件的使用

1、按钮Button: Button是Android最常用的控件之一。其用法我们这里主要是关注三个方面 ,一是点击事件,二是长按事件,三是设置文本、、点击背景效果等等。 其中点击事件和长按事件用法上跟Java差不多,主要有匿名函数方式、内部类、接口实现三种。但是设置文本和获取文本有一些变化。 a、匿名函数方式的点击事件和长按事件以及文本处理: Button的点击事件的实现及注意事项: btnButton.setOnClickListener { //因为it是一个View,因此我们要把它强制转换为Butt

haoyuegongzi的博客 3284
上一篇: Kotlin学习教程(七)
下一篇: Kotlin学习教程(九)
CharonChui
博客等级 码龄12年 66粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值