我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kotlin 轻量级Android开发

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kotlin 轻量级Android开发

Kotlin 是什么

Kotlin是一门运行在JVM之上的语言。

它由Jetbrains创建,而Jetbrains则是诸多强大的工具(如知名的Java IDE IntelliJ IDEA)背后的公司。Kotlin是一门非常简单的语言,其主要目标之一就是提供强大语言的同时又保持简单且精简的语法。
在这里插入图片描述

kotlin 特性

其主要特性如下所示:

  1. 轻量级:这一点对于Android来说非常重要。项目所需要的库应该尽可能的小。Android对于方法数量有严格的限制,Kotlin只额外增加了大约6000个方法。
  2. 互操作:Kotlin可与Java语言无缝通信。这意味着我们可以在Kotlin代码中使用任何已有的Java库;因此,即便这门语言还很年轻,但却已经可以使用成百上千的库了。除此之外,Kotlin代码还可以为Java代码所用,这意味着我们可以使用这两种语言来构建软件。你可以使用Kotlin开发新特性,同时使用Java实现代码基的其他部分。
  3. 强类型:我们很少需要在代码中指定类型,因为编译器可以在绝大多数情况下推断出变量或是函数返回值的类型。这样就能获得两个好处:简洁与安全。使用var声明可变参数,val声明不可变参数 varvar是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和Java中声明变量的方式一样。 val: val是一个只读变量,这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化,因为以后不能被改变。 上段代码: var name = "ztz" println(name) name = "yif" println(name) val finalValue = "i v"; println(finalValue); 结果如下: ztz yif iv
  4. 空安全:Java最大的一个问题就是null。如果没有对变量或是参数进行null判断,那么程序当中就有可能抛出大量的NullPointerException,然而在编码时这些又是难以检测到的。Kotlin使用了显式的null,这会强制我们在必要时进行null检查。
  5. 语法糖
    • 类的简化,隐式getter()、setter()
    • 接口的默认实现
    • lambda与高阶函数
    • 空指针安全,编译时期的空指针检查
    • 流式集合操作 map(), forEach()
  6. 新特性
    • 函数拓展、属性拓展
    • 属性代理

Kotlin 轻量级开发

Null安全

Kotlinnull安全的。如果一个类型可能为null,那么我们就需要在类型后面加上一个?。这样,每次在使用该类型的变量时,我们都需要进行null检查。比如说,如下代码将无法编译通过:

var artist: Artist? = null?artist.print()

第2行会显示一个错误,因为没有对变量进行null检查。我们可以这样做:

if (artist != null) {? artist.print()?}

这展示了Kotlin另一个出色的特性:智能类型转换。如果检查了变量的类型,那就无需在检查作用域中对其进行类型转换。这样,我们现在就可以在if中将artist作为Artist类型的变量了。这对于其他检查也是适用的。还有一种更简单的方式来检查null,即在调用对象的函数前使用?。甚至还可以通过Elvis运算符?提供另外一种做法:

val name = artist?.name ?: ""

数据类data

Java中,如果想要创建数据类或是POJO类(只保存了一些状态的类),我们需要创建一个拥有大量字段、getterssetters的类,也许还要提供toStringequals方法:

public class Artist {    private long id;    private String name;    private String url;    private String mbid;     public long getId() {        return id;    }     public void setId(long id) {        this.id = id;    }     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public String getUrl() {        return url;    }     public void setUrl(String url) {        this.url = url;    }     public String getMbid() {        return mbid;    }     public void setMbid(String mbid) {        this.mbid = mbid;    }     @Override public String toString() {        return "Artist{" +                "id=" + id +                ", name='" + name + '\'' +                ", url='" + url + '\'' +                ", mbid='" + mbid + '\'' +                '}';    }}

Kotlin中,上述代码可以写成下面这样:

data class Artist (?    var id: Long,    var name: String,    var url: String,    var mbid: String)

Kotlin使用属性而非字段。基本上,属性就是字段加上其gettersetter

互操作

Kotlin提供了一些非常棒的互操作特性,这对于Android开发帮助非常大。其中之一就是拥有单个方法的接口与lambda表达式之间的映射。这样,下面这个单击监听器:

view.setOnClickListener(object : View.OnClickListener {    override fun onClick(v: View) {        toast("Click")?    }?})

可以写成这样:

view.setOnClickListener { toast("Click") }

此外,getterssetters都会自动映射到属性上。这并不会造成性能上的损失,因为字节码实际上只是调用原来的getterssetters。如下代码所示:

supportActionBar.title = titletextView.text = titlecontactsList.adapter = ContactsYifAdapter()

Lambda表达式

Lambda表达式会在极大程度上精简代码,不过重要的是借助于Lambda表达式,我们可以做到之前无法实现或是实现起来非常麻烦的事情。借助于Lambda表达式,我们可以以一种更加函数式的方式来思考问题。Lambda表达式其实就是一种指定类型,并且该类型定义了一个函数的方式。比如说,我们可以像下面这样定义一个变量:

val listener: (View) -> Boolean

该变量可以声明一个函数,它接收一个view并返回这个函数。我们需要通过闭包的方式来定义函数的行为:

val listener = { view: View -> view is TextView }

上面这个函数会接收一个View,如果该viewTextView的实例,那么它就会返回true。由于编译器可以推断出类型,因此我们无需指定。还可以更加明确一些:

val listener: (View) -> Boolean = { view -> view is TextView }

借助于Lambda表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可:

fun asyncOperation(value: Int, callback: (Boolean) -> Unit) {    ...    callback(true)?}asyncOperation(5) { result -> println("result: $result") }

还有一种更加简洁的方式,如果函数只接收一个参数,那就可以使用保留字it

asyncOperation(5) { println("result: $it") }

高阶函数

lambda`本身作为一等公民,它是有类型的。比如下面这个加法表达式sum的类型为`(Int, Int) -> Int。val sum: (Int, Int) -> Int = { x, y -> x+y }

一个变量有类型是再自然不过的事。而高阶函数的入参与返回值既然是lambda,那其类型奇怪一点也很正常。

fun main(args: Array<String>) {    // 自定义高阶函数, lambda 表达式 作为入参    listOf("1", "2", "3", "4").myForEach { println(it) }    // 自定义高阶函数, lambda 表达式 作为返回值//    getLogger()("I'm a Closure")    var logger = getLogger()    logger("I'm a Closure")}fun <T> List<T>.myForEach(doTask: (T) -> Unit){    for(item in this)        doTask(item)}fun getLogger(): (String) -> Unit{//    return { println(it) }    return fun (it: String){        println(it)    }}

PS: 看到getLogger()这种用法,你大概意识到可以像js那样写闭包了。

接口的默认实现

顾名思义,它便是指接口可以和抽象类一样,有方法体的默认实现。 我把它归结在语法糖里,是因为java8中早已有了一模一样的东西,对应的关键字叫default

interface A {    fun foo() { println(&quot;A&quot;) }    // 默认实现, 打印"A"    fun bar()} interface B {    fun foo() { println(&quot;B&quot;) }    fun bar() { println(&quot;bar&quot;) }} // 多继承时,显式指定 super<A>.foo() 以去冲突class D : A, B {    override fun foo() {        super&lt;A&gt;.foo()        super&lt;B&gt;.foo()    }     override fun bar() {        super.bar()    }}

流式集合操作 map(), forEach()

流式集合操作符,算是很普遍了,任何语言里都有,然而不支持函数式的话,写起来比较臃肿。 如下例子,一些操作符的衔接,使得操作逻辑十分清晰,之后需求变动,比如降序改为升序,也只需改动sortedDescending()一行,十分灵活。

fun main(args: Array&lt;String&gt;){    val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)    list.filter { it%2==0 }             // 取偶数            .map{ it*it }               // 平方            .sortedDescending()         // 降序排序            .take(3)                    // 取前 3 个            .forEach { println(it) }    // 遍历, 打印} // 输出:1006436

拓展

拓展这个东西,貌似是以装饰者模式来做的。它的效果是在不改源码的基础上,添加功能。比如我们要在Activity上加一个toast(),完全不用卸载基类里。这样简化了很多工作,尤其是对一些已打成jar包的类。

fun Activity.toast(msg: String) {    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()}fun main(args: Array&lt;String&gt;) {    val list = listOf(&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;)     // 函数拓展    list.myForEach { println(it) }     // 属性拓展    println(&quot;last: ${list.lastItem}&quot;)} fun &lt;T&gt; List&lt;T&gt;.myForEach(doTask: (T) -&gt; Unit){    for(item in this)        doTask(item)} val &lt;T&gt; List&lt;T&gt;.lastItem: T        get() = get(size - 1) // 输出:1234last: 4

属性代理

它把属性的get()set()代理给了一个类,以便可以在get()set()时做一些额外的操作。如:

  • 懒加载
  • 观察者(属性变化时,自动发出通知)
  • 属性非空判断 以懒加载为例,lazySum可能需要复杂的运算,我们把它代理给lazy。 可以看到,只有第一次加载进行了计算,之后都是直接取值,提高了效率。 val lazySum: Int by lazy { println("begin compute lazySum …") var sum = 0 for (i in 0…100) sum += i println("lazySum computed!n") sum // 返回计算结果 } fun main(args: Array) { println(lazySum) println(lazySum) } // 输出: begin compute lazySum … lazySum computed! 5050 5050 Anko AnkoKotlin团队开发的一个库,旨在简化Android开发。其主要目标在于提供一个DSL,使用Kotlin代码来声明视图: verticalLayout { val name = editText() button("Say Hello") { onClick { toast("Hello, ${name.text}!") } } } 它还提供了其他一些很有用的特性。比如说,导航到其他Activity和传值到其它界面: startActivity("id" to res.id, "name" to res.name) startActivity( Pair(Constants.CONTENT_TITLE_KEY, useWebsiteBean.name), Pair(Constants.CONTENT_URL_KEY, useWebsiteBean.link), Pair(Constants.CONTENT_ID_KEY, useWebsiteBean.id) ) 总结 Kotlin真的在很多方面都简化了Android的开发工作。它会提升你的生产力,并且可以通过非常不同且更加简单的方式来解决一些常见的问题。让我们一起使用Kotlin来快速敏捷开发吧。

来源地址:https://blog.csdn.net/hdbdhdbh/article/details/131286043

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kotlin 轻量级Android开发

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Kotlin开发Android应用教程

使用Kotlin开发Android应用1、Kotlin介绍 [Kotlin](https://kotlinlang.org/)Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界
2023-05-31

怎么使用Kotlin开发Android应用

要使用Kotlin开发Android应用,你可以按照以下步骤进行:1. 安装Kotlin插件:在Android Studio中,打开"Preferences"(Mac)或"Settings"(Windows),然后选择"Plugins"。在
2023-08-16

钉钉 轻量开发

首先,我们需要了解钉钉是一款什么样的应用程序。钉钉是阿里巴巴旗下的企业级应用程序,主要面向企业和团队用户。它的特点是轻量、高效、安全、易用。在使用钉钉开发的过程中,我们可以看到它的界面设计简洁、易于使用,同时具有高度的稳定性和可靠性。其次,我们需要了解钉钉开发中的一些关键技术。钉钉开发中的一些关键技术包括但不限于:消息
钉钉 轻量开发
2023-10-28

Python用Bottle轻量级框架进行Web开发

当前Python Web开发中的框架算Django最为流行了,但是本文介绍的是一个较为轻量级的Web框架:Bottle框架。理论性的东西就不讲了,直接上实例代码。 1.问题描述最近做一个系统的后台开发,用的就是Python+Bottle进行
2022-06-04

如何使用Kotlin开发一个Android应用

如何使用Kotlin开发一个Android应用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一步:为AndroidStudio安装Kotlin插件在线安装步骤
2023-05-30

详解Kotlin和anko融合进行Android开发

kotlin是一门基于jvm的编程语言,最近进行了关于kotlin和 anko的研究。并且结合现在的APP设计模式,设想了初步的开发方式。并且准备应用在新的项目中。Kotlin和ankoKotlin是大名鼎鼎的JB公司开发的jvm语言,官网
2023-05-30

Android应用怎么利用Kotlin进行开发

本篇文章给大家分享的是有关Android应用怎么利用Kotlin进行开发,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Kotlin 非常适合开发 Android 应用程序,将现
2023-05-31

利用Kotlin语言怎么进行Android开发

这期内容当中小编将会给大家带来有关利用Kotlin语言怎么进行Android开发,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代
2023-05-31

利用Kotlin开发你的第一个Android应用

首先,确保你已经安装了Android Studio,并且已经配置好了Kotlin开发环境。1. 打开Android Studio,点击"Start a new Android Studio project",然后选择"Empty Activ
2023-08-16

Android Kotlin开发实例(Hello World!)及语法详解

Android Kotlin开发实例及语法详解前言Kotlin是一种在 Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言。该语言有几个优势 1. 简洁 它大大减少你需要写的样板
2023-05-31

C++轻量级界面开发框架ImGUI有什么用

这篇文章给大家分享的是有关C++轻量级界面开发框架ImGUI有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ImGUI简介  ImGUI主要用于游戏行业,所有的控件都需要手绘实现,当然性能也是满满的,毕竟是
2023-06-25

基于Golang开发一个轻量级登录库/框架

几乎每个项目都会有登录,退出等用户功能,而登录又不单仅仅是登录,我们要考虑很多东西。所以本文就来用Golang开发一个轻量级登录库/框架吧
2023-05-19

使用Kotlin如何实现开发一个Android应用

今天就跟大家聊聊有关使用Kotlin如何实现开发一个Android应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。配置项目gradle文件apply plugin: com.and
2023-05-31

Android智能指针轻量级LightPointer初识

这篇文章主要为大家介绍了Android智能指针轻量级LightPointer初识详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-09

Android开发之Kotlin委托的原理与使用详解

我们常用的委托模式怎么使用?在 Java 语言中需要我们手动的实现,而在 Kotlin 语言中直接通过关键字 by 就可以实现委托,下面我们就一起看看不同种类的委托使用以及在 Android 常见的一些场景中的使用
2023-03-23

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录