Kotlin在Android上的运用(三)

Android Kotlin知识汇总(三)Kotlin 协程 Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。本主题介绍如何使用 Kotlin 协程解决以下问题,从而让您能够编写出更清晰、更简洁的应用代码。 阅读详情

0.HelloWorld

和所有其他语言一样,Kotlin Koans的第一个任务名称就是Hello World,这个任务比较简单,提示也说的很清楚,就是要求task0函数返回一个字符串OK:

fun task0(): String {
    return "OK"
}

这一个任务主要涉及kotlin的函数定义。在kotlin中函数通过关键字fun声明,和Java中函数的返回类型写在函数名称前不一样,Kotlin中函数的返回类型在函数名称的后面,中间以:分开。Kotlin中的函数总是返回一个值,如果不指定返回值的类型,默认返回Uint(类似Java中的Void)。如果函数体就是一个简单的语句,可以去掉大括弧,用等号表示:

fun task0(): String = "OK"

1.Java to Kotlin Convert

这个任务的要求就是将一段Java代码转换成Kotlin代码,提示可以直接将Java代码复制粘贴,然后使用Intellij提供的Convert Java File to Kotlin File功能(仅仅是这个任务允许这样做),非常便捷。

//Java
public String task1(Collection<Integer> collection) {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        Iterator<Integer> iterator = collection.iterator();
        while (iterator.hasNext()) {
            Integer element = iterator.next();
            sb.append(element);
            if (iterator.hasNext()) {
                sb.append(", ");
            }
        }
        sb.append("}");
        return sb.toString();
    }

//Kotlin

fun todoTask1(collection: Collection<Int>): String
        {
            val sb = StringBuilder()
            sb.append("{")
            val iterator = collection.iterator()
            while (iterator.hasNext()) {
                val element = iterator.next()
                sb.append(element)
                if (iterator.hasNext()) {
                    sb.append(", ")
                }
            }
            sb.append("}")
            return sb.toString()
        }

这一段代码两者之间没有明显的差别,但是在下一个任务中可以看到Kotlin中这一段代码可以精简成一行代码。

2.Named Arguments (命名参数)

任务的要求是使用Kotlin提供的方法joinToString()重新完成任务1,只指定joinToString的参数中的两个参数。

这里涉及到Kotlin函数的默认参数(Default Arguments)和命名参数(Named Arguments)两个语法。

Kotlin中函数参数可以有默认值,当函数被调用时,如果没有传递对应的参数,那么就使用默认值。和其他语言相比,这以功能可以大大的减少重载函数的数目。参数的默认值在参数的类型后面通过=赋值。重写函数(overriding method)使用和被重写函数相同的默认参数。也就是说当我们重写一个有默认参数的函数时,我们不允许重新指定默认参数的值。

当我们在调用函数时,可以为传递的参数命名,这在当一个函数的参数很多或者函数参数具有默认值的时候非常方便。

让我们回到任务本身,该任务要求使用joinToString函数重新完成任务1,并且只能指定两个参数。

我们来看一下joinToString函数的定义:

/**
 * Creates a string from all the elements separated using [separator] and using the given [prefix] and [postfix] if supplied.
 * 
 * If the collection could be huge, you can specify a non-negative value of [limit], in which case only the first [limit]
 * elements will be appended, followed by the [truncated] string (which defaults to "...").
 */
public fun <T> Iterable<T>.joinToString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): String {
    return joinTo(StringBuilder(), separator, prefix, postfix, limit, truncated, transform).toString()
}

该函数对分隔符,前缀,后缀等其他参数都指定了默认值,我们再参考任务1中的描述,我们只需要重新指定前缀、后缀两个参数。命名参数通过在参数值的前面指定参数名称就可以,中间需要一个=:

fun task2(collection: Collection<Int>): String {
    return collection.joinToString(prefix = "{", postfix = "}")
}

3.Default Arguments(默认参数)

默认参数的语法在前面已经做了介绍,直接来看任务。任务要求是将JavaCode3中所有的函数重载用一个函数替换。

public class JavaCode3 extends JavaCode {
    private int defaultNumber = 42;

    public String foo(String name, int number, boolean toUpperCase) {
        return (toUpperCase ? name.toUpperCase() : name) + number;
    }

    public String foo(String name, int number) {
        return foo(name, number, false);
    }

    public String foo(String name, boolean toUpperCase) {
        return foo(name, defaultNumber, toUpperCase);
    }

    public String foo(String name) {
        return foo(name, defaultNumber);
    }
}

所有的重载都是解决一个问题,字符串和数字的拼接,并且需要说明字母是否转换为大写,默认是不转换。Kotlin的实现:

fun foo(name: String, number: Int = 42, toUpperCase: Boolean = false): String {
    val upCaseName = if (toUpperCase) name.toUpperCase() else name
    return upCaseName+number.toString()
}

精简一下:

fun foo(name: String, number: Int = 42, toUpperCase: Boolean = false): String  
        = (if (toUpperCase) name.toUpperCase() else name)+number

4.Lambdas

这个任务的要求是用Kotlin重写JavaCode4.task4()函数,不允许使用Iterables类,可以通过Intellij IDEA的代码补全来选择合适的方法。

Java版本的代码:

public class JavaCode4 extends JavaCode {
    public boolean task4(Collection<Integer> collection) {
        return Iterables.any(collection, new Predicate<Integer>() {
            @Override
            public boolean apply(Integer element) {
                return element % 42 == 0;
            }
        });
    }
}

就是判断列表中是否包含42整数倍的元素,先实现功能:

fun task4(collection: Collection<Int>): Boolean  {
    val devide42: (Int) -> Boolean = { x -> x % 42 == 0 }
    return collection.filter(devide42).isEmpty().not()
}

这里使用了Collection的filter函数。这个任务主要学习Kotlin中Lambda表达式的知识,简单来说:

lambda表达式总是用大括弧包起来
它的参数(如果有的话)在->符号前面声明(参数类型可以省略)
函数体写在->符号后面
在Kotlin中,如果一个函数的最后一个参数是一个函数,并且你在调用该函数时最后一个参数传递的是一个lambda表达式,那么可以将这个lambda表达式写在括弧外面:

fun task4(collection: Collection<Int>): Boolean  {
    return collection.filter(){ x -> x % 42 == 0 }.isEmpty().not()
}

如果只有lambda表达式这一个参数,那么括弧也可以省略:

fun task4(collection: Collection<Int>): Boolean  {
    return collection.filter{ x -> x % 42 == 0 }.isEmpty().not()
}

如果lambda表达式也只有一个参数,那么这个参数连同->符号也可以省略,直接将它命名为it:

fun task4(collection: Collection<Int>): Boolean = 
    collection.filter { it%42 ==0 }.isNotEmpty()

5.String Templates

任务要求生成一个正则表达式,可以匹配’13 JUN 1992’这样格式的字符串。
主要是学习Kotlin的各种字符串模板,Kotlin中字符串有两种,通过 一对”包起来自字符串,这里可以支持转义字符。如:

val s = "Hello, world!\n"

或者通过一对”“”包起来的字符串,如:

val text = """
    for (c in "foo")
        print(c)
"""

字符串还可以包含模板表达式(template expressions),如:

val i = 10
val s = "i = $i" // evaluates to "i = 10"

val s1 = "abc"
val str = "$s1.length is ${s1.length}" // evaluates to "abc.length is 3"

val price = """
${'$'}9.99
"""

回到我们的任务本身,任务里面已经给了足够的提示,完成起来也比较容易:

val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"
fun task5(): String = """\d{2} ${month} \d{4}"""

6.Data Class

任务要求将JavaCode6.Person类转换成Kotlin。先来看看Java源码:

public class JavaCode6 extends JavaCode {

    public static class Person {
        private final String name;
        private final int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
    }
}

Kotlin实现:

data class Person(val name: String, val age: Int)

Kotlin中Data class对应Java中的实体类,需要在定义类时标明为data,编译器会自动根据主构造函数中定义的属性生成下面这些成员函数:

equals()函数和hashCode()函数
toString()函数,返回的形式为”Person(name=TangSir, age=28)”
componentN()函数,componentN()具体返回的值根据类定义时属性定义的属性决定。如:

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

copy()函数

但是如果上面列出来的函数已经在类的实现中显式定义或者继承了父类相应的函数,编译器则不会生成相应的函数。

为了保持一致性以及编译器所生成代码具有意义,data class必须满足以下这些条件:

主构造函数至少有一个参数
主构造函数中的所有参数都必须定义为val或者var
Data class不能是abstract, open, sealed or inner
7.Nullable Type

任务要求将ava版本sendMessageToClient用Kotlin实现,只允许使用一个if语句:

public void sendMessageToClient(@Nullable Client client, @Nullable String message, @NotNull Mailer mailer) {
        if (client == null || message == null) return;

        PersonalInfo personalInfo = client.getPersonalInfo();
        if (personalInfo == null) return;

        String email = personalInfo.getEmail();
        if (email == null) return;

        mailer.sendMessage(email, message);
    }

这是我们常见的防御式编程,处处都要考虑变量是否为null的情况。

Kotlin对null的保护总结为以下几点:

如果一个变量可能为null,那么在定义的时候在类型后面加上?
val a: Int? = null
对于一个可能为null的变量,如果必须在其值不为null时才进行后续操作,那么可以使用?.操作符来保护,下面的两种表示方式是等效的,即a为null时什么都不做:

 val a: Int? = null
  ...
  //if statment
  if (a != null){
      a.toLong()
  }

  //?.operator
  a?.toLong()

当一个变量为null时,如果我们想为它提供一个替代值,那么可以使用?:

val myLong = a?.toLong() ?: 0L

上面的语句的意思就是如果a确实为null,那么将myLong赋值为0

最后一条,就是对于如果一个可能是null,如果我们可以确保它已经不是null,那么可以使用!!操作符。但是不推荐这么使用。!!是坏代码的味道。

 val a: Int? = null
  ...
  a!!.toLong()

回到我们的任务,由于只允许使用一个if语句,官方的参考答案是这样的:

fun sendMessageToClient(
     client: Client?, message: String?, mailer: Mailer
) {
 val email = client?.personalInfo?.email
 if (email != null && message != null) {
     mailer.sendMessage(email, message)
 }
}

8.Smart Casts

任务要求使用Kotlin的Smart Cast和When表达式重新实现JavaCode8.eval()函数:

public class JavaCode8 extends JavaCode {
    public int eval(Expr expr) {
        if (expr instanceof Num) {
            return ((Num) expr).getValue();
        }
        if (expr instanceof Sum) {
            Sum sum = (Sum) expr;
            return eval(sum.getLeft()) + eval(sum.getRight());
        }
        throw new IllegalArgumentException("Unknown expression");
    }
}

也是我们常见的强制类型转换。

在Kotlin中,多数情况下我么不需要显式的使用强制转换,因为编译器会为不可变的变量带入is检查,并且在必要的时候自动插入(安全的)强制转换。is通常和when表达式一起搭配使用:

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

when和Java中的switch/case语句相似,但是要强大的多。主要区别在于when语句的参数可以是任何类型,其所有分支的判断条件也可以是任何类型的。

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}

when可以作为一个语句也可以作为一个表达式,如果作为一个表达式使用,它可以有返回值,所以必须覆盖所有可能的条件或者实现else分支,否则编译器会报错。

val result = when (x){
    0, 1 -> "binary"
    else -> "error"
}

除此之外,when的条件语句还有很多其他的表达方式,如判断范围等,可以参考官方文档。

回到任务的解决:

fun eval(e: Expr): Int =
        when (e) {
            is Num -> e.value
            is Sum -> eval(e.left) + eval(e.right)
            else -> throw IllegalArgumentException("Unknown expression")
        }

9.Extension Functions

Kotlin中函数扩展就是不修改一个类的源码(通常是我们没有源码,无法修改)的情况下,通过扩展函数为一个类添加一个新的功能。扩展函数在行为好像它属于被扩展的类,所以在扩展函数中我们可以使用this以及所有被扩展类的公有方法。

任务要求为Int和Pair

data class RationalNumber(val numerator: Int, val denominator: Int)
fun Int.r(): RationalNumber = RationalNumber(this, 1)
fun Pair<Int, Int>.r(): RationalNumber = RationalNumber(this.first,this.second)

Pair的扩展函数r中this可以省略:

fun Pair<Int, Int>.r(): RationalNumber = RationalNumber(first,second)

10.Object Expression

Kotlin中当我们需要创建某一个类的对象并且只需要对该对象做一点小的修改,而不需要重新创建一个子类时可以使用object expression。和Java中的匿名内部类很相似。

任务的要求是创建一个比较器(comparator),提供给Collection类对list按照降序排序。先来实现功能:

fun task10(): List<Int> {
    val arrayList = arrayListOf(1, 5, 2)
    Collections.sort(arrayList,object: Comparator<Int>{
        override fun compare(x: Int, y: Int): Int {
            return y-x
        }
    })
    return arrayList
}

加粗部分就是所谓的object expression,修改为lambda表达式(哦哦,这好像是Task11的任务要求)

fun task10(): List<Int> {
    val arrayList = arrayListOf(1, 5, 2)
    Collections.sort(arrayList) { x, y -> y - x }
    return arrayList
}

这个任务还展示了Kotlin和Java之间的交互,因为task10()函数中Collections是一个Java类。

11.SAM Conversions

所谓SAM conversions就是如果一个object实现了一个SAM(Single Abstract Method)接口时,可以直接传递一个lambda表达式,代码实现在上面。

12.Extensions On Collections

在Kotlin的标准库提供了许多扩展函数使得集合的使用非常方便。由于Kotlin可以很容易的和Java代码混合使用,所有Kotlin直接是使用标准的Java集合类(做了细小的改进)。

本任务的要求就是使用扩展函数sortedDescending重写上一个任务中的代码:

fun task12(): List<Int> {
    return arrayListOf(1, 5, 2).sortedDescending()
}
安卓入门二 Kotlin基础 但大佬们的思维就比较活跃,因为开发过程中关注的一个 DOM/ View 的属性是很少的,所以就创造了一个轻量级的数据结构来表示一个 DOM/View 节点,由于数据结构比较轻量,那么销毁创建就可以随意点。如果我们频繁的变更状态,那就会频繁的触发 Recomposition,如果每次还是重新生成一个巨大的 Virtual DOM 树,那框架内部的 diff 就会非常耗时,那么性能问题随之就来了,这是很多同学用 Compose 写出的代码卡顿的原因。选择任意一个日期,可以发现弹出的toast是! 阅读详情

相关推荐

一款纯 Kotlin 编写的开源安卓应用 "Smile"

我从对 Kotlin 一窍不通,到完整开发出此 App,共用了 9 天,其中有 4 天只在晚上开发,也就是说共计 5 天 + 4 个晚上。另外由于我对 ui 的挑剔,主题色的挑选及 logo 设计至少占去五分之一的时间。我并不是在炫耀我的自学能力,Smile 的内容并不算多,肯定有很多大牛比我快,我想表达的是这 9 天的学习及开发过程是刀过竹解、得心应手的。所以我想把这个学习过程分享给大家,只要能帮到一个人,那就是有

yhao的博客 6238

Google 宣布废弃 LiveData.observe 方法

本篇文章作为技术动态了解即可,废弃 LiveData.observe() 扩展方法,已经不是什么新的新闻了,在很久以前,Google 废弃掉这个方法的时候,第一时间我在 朋友圈 和 掘金沸点 发过一个消息,如下图所示。 通过这篇文章你将学习到以下内容: 为什么增加 LiveData.observe() 扩展方法? 既然增加了,为什么有要废弃 LiveData.observe() 扩展方法? Kotlin 1.4 语法的特性 什么是函数式(SAM)接口? 什么是 SAM 转换? 为什么废弃 Liv

公众号:ByteCode 1980

Kotlin Android 环境搭建

通过以上步骤,您已经成功搭建了 Kotlin Android 开发环境。接下来,您可以开始学习 Kotlin 语言和 Android 开发,创作出属于自己的移动应用。祝您学习愉快!

lsx202406的博客 1390

Kotlin 中 Lambda的使用 三、SAM转换 (Single Abstract Method Conversions)

一、函数式接口 只定义了一个抽象方法的接口称为函数式接口(SAM接口)。函数式接口可以有多个非抽象方法,但只能有一个抽象方法。比如:java中 public interface OnClickListener { void onClick(View v); } kotlin中(kotlin 1.4 之前不支持函数式接口,1.4之后才支持):通过关键词 fun 声明 @FunctionalInterface fun interface OnC...

old_land的博客 797

基于LangGraph的智能报告生成平台项目分析

不知道你是否知道或者了解OpenAI and Gemini Deep Research。他们是一种能够根据输入问题进行规划、结合网络搜索获取信息并最终呈现结果的研究工具或技术。那这样research是如何实现的呢?最近刚好看到一个实现类似功能的开源项目: open_deep_search。本文将基于该项目进行代码层面剖析。

u011160113的博客 923

ubuntu18.04安装R——无法连接上 dl.google.com:80 (6.6.6.6),连接超时&&E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

安装R的时候,sudo apt update 的时候出现错误: 查资料要修改/etc/apt/sources.list.d/google-chrome.list 文件 原来是: deb http://dl.google.com/linux/chrome/deb/ stable main 改为: deb [arch=amd64] http://dl.google.com/linux/chrom...

许希律的博客 4348

安卓常见设计模式11------迭代器模式(Kotlin版)

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种遍历集合对象的方法,而无需暴露集合的内部表示。迭代器模式由两个主要角色组成:迭代器(Iterator)和集合(Collection)。

jiet_h的博客 1206

python DEA: 基于非径向距离NDDF的Malmquist-Luenberger 指数及其分解

点赞发Nature 关注中Science Malmquist-Lenberger指数(ML指数)是距离函数与DEA计算中常用的指数,ML指数可以进一步分解为技术进步technological progress和效率改善effeciency change. 技术进步常被当做增长模型中的全要素生产率,用到许多计量经济研究中,探讨影响技术进步的环境变量。这里我分享一个考虑非期望产出下的NDDF方法计算ML指数。 该ML指数为global ML(区别于sequential ML) import numpy as

Cmmmmm丶的博客 5295

【Kotlin】循环控制流 ( for 循环 | Iterator 遍历形式 | Iterator 遍历要求 | IntArray 源码解析 )

一、For 循环、 二、For 循环遍历 Iterator 对象、 三、Iterator 遍历要求、 四、IntArray 源码解析

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3239

Java对接海康威视明眸门禁设备

海康威视合作生态致力打造一个能力开放体系、两个生态圈,Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上,融合AI、大数据、云计算等技术,为合作伙伴提供的一个二次开发及创新的平台。的SDK复制到linux的lib目录下(如果是docker发布,记得做好共享映射哦)大家有没有想过,windows版的SDK为什么要复制到项目根目录的lib文件夹下?所以发布到linux的时候,我们需要将。打开AcsMain文件。................

Good Luck 7875

Ubuntu安装有线网卡驱动

问题:插入网线后,无法识别有线连接。 原因:主板有线网卡的型号和系统中网卡的驱动不匹配 解决 前提条件: 需要连wifi通网,因为需要安装dkms,和下载驱动。 删除原驱动 1、查看网卡型号 lspci | grep net 我的网卡型号是8125 2、查看网卡驱动 lspci -k 网卡驱动是r8169 3、卸载网卡驱动 找出位置 modinfo r8169 | grep filename 然后删除 rm path/r8169.ko 卸载驱动 rmmod r8169 查看是否卸载成功 lsm

weixin_43932656的博客 1万+

Kotlin用高阶函数处理集合数据

一个函数f(x) 的接收参数是另一个函数(g(x))或者它的返回值是另一个函数(h(x)),在Kotlin中f(x)就是一个高阶函数。Kotlin标准库中为开发者提供了丰富的高阶函数,有sumBy, reduce, fold, map,filter,forEach等。本篇文章就来学习这些高阶函数的使用。.........

大模型学习路线 2294

Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试

1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。

jzwjzw19900922的博客 1509

Kotlin入门(Android开发)基础知识汇总(三)之函数运用

1.函数的基本用法 //java @Override public void onCreate(Bundle savedInstanceState) { ... } //Kotlin override fun onCreate(savedInstanceState: Bundle?) { ... } <1>使用小写“override”在同一行表达重载操作; <2>...

u010218230的博客 336

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1134

量产导入 | 产品可靠性测试标准完整大集合(JEDEC/IEC/SAE…)

产品可靠性测试是产品质量保证中的重要一环, 包含有Pre-con, aging(寿命)和ESD(静电)等, 下面就收集了权威标准JEDEC全系列, 请参照如下 同时也附上其它的可靠性标准供大家参考及交叉理解, 可能侧重点不同, 大家可以参考下。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1661

安卓开发的两种语言比较——Java & Kotlin

安卓、Java、Kotlin历史简介。Kotlin与Java的比较。

u014773418的专栏 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

新手必看:如何使用create-android-kotlin-app创建你的第一个Kotlin安卓应用

create-android-kotlin-app是一款强大的命令行工具,能帮助开发者通过一行命令快速创建Kotlin安卓项目,极大简化了安卓应用的初始化流程。无论是安卓开发新手还是有经验的开发者,都能通过这个工具快速搭建标准化的项目结构,让你专注于功能开发而非繁琐的配置工作。 ## 为什么选择create-android-kotlin-app? 对于安卓开发新手来说,手动配置项目环境往往是一

gitblog_00634的博客 832

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

kotlin入门系列-第一个kotlin的android demo

google I/O后浏览新闻知道了kotlin已经是Android开发第一语言,很想试试这个新的语言开发有什么不同。   在Ubuntu上我的Android studio是2.3版本的,因此,先配置kotlin的环境是第一步,在“file”--“setting”搜索plugin然后在里面搜索kotlin插件,就能够找到对应的了,然后下载,如下图所示:   幸好不越墙也是可以下载的,不过公

BlackSmith 3336

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android 安卓开发语言kotlin与Java该如何选择

通过kotlin的自身问题,其实kotlin就是一种插件语言,最终还是翻译成Java,只是目前来看,通过翻译的目标类,还是Java本身,但是增加了特别多的校验,导致写法和Java有很大的不同。这种不同来自我们的习惯问题。有人提前判空,有人喜欢丢在使用出判空,调用处让语法自然一些。Android应用不像PC,空指针是致命的BUG,出现一个就会导致崩溃。所以,kotlin对空指针校验特别严格,也对使用埋下了隐患,新手可以绕开校验,但是对于绕开的原理不够理解,就会引起崩溃。

8348

Android面试题——kotlin相关面试题

Jetpack 是一个丰富的组件库,它的组件库按类别分为 4 类1-架构(Architecture)LifecyclesLiveDataNavigationPagingRoomViewModel2- 界面(UI)EmojiFragmentLayoutPalette3-行为(behavior)SharingSlices4-基础(foundation)AppCompatMultidexTest。

我的博客 6055

c++开发安卓_浅谈Kotlin,安卓编程者须知

浅谈Kotlin,安卓编程者须知大家好,这一期呢,我们谈一下kotlin。Google在安卓开发环境中支持kotlin始于2017年的Google io, 大家应该都知道了。在此之前,Android的官方编程语言有c,c++和Java。​当然了,其他的语言也有不少,你也可以用xamarin和csharp来写安卓的程序,也可以用react native加JavaScript写安卓程序, Unity3...

weixin_39581739的博客 514

kotlin安卓开发(2):HelloWorld

Kotlin 的智能类型推断是其类型系统中的一个强大特性,它允许编译器自动推断变量的类型,从而减少显式类型声明的需要,使代码更加简洁和易读。存储值范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。在 Kotlin 中,var 和 val 是用来声明变量的关键字,它们的主要区别在于变量的可变性。在左侧的项目类型列表中,选择了“Kotlin”,创建一个使用 Kotlin 编程语言的项目。val 声明的变量是可变的,可以在赋值后被重新赋值。

qq_57404999的博客 2160

Kotlin 安卓开发学习手册(三)

数组是固定大小的元素容器,元素可以是对象或原始数据类型。到目前为止,我们已经知道了很多关于对象的知识,但是我们还没有过多地讨论过原始数据类型。从 Kotlin 的观点来看,最好是完全没有这种区分,只处理对象而不处理其他。那么为什么会有类似原始数据类型的东西,它们到底是什么,为什么我们需要使用它们?答案是原始数据类型在计算机硬件上有一个直接的表示。因此,在将对象放入数组之前,我们既不需要执行对象的实例化,也不需要使用某种引用将数组元素连接到实例(见图 9-1 )。图 9-1原始数组与对象数组对象数组。

龙哥盟 1255

Kotlin 安卓开发(一)

如今,Android 应用程序开发流程非常广泛。在过去几年中,我们已经看到各种工具如何演变,使我们的生活变得更加轻松。然而,Android 应用程序开发流程的一个核心元素在很长一段时间内并没有太多改变,那就是 Java。Android 平台适应了较新版本的 Java,但要能够使用它们,我们需要等待很长时间,直到新的 Android 设备达到适当的市场普及。此外,在 Java 中开发应用程序也带来了一系列挑战,因为 Java 是一种旧语言,存在许多设计问题,由于向后兼容性约束,这些问题并不容易解决。另一方面,

龙哥盟 1792

kotlin写android,Kotlin安卓开发

1.配置Android Studioa.在Project对应的build.gradle文件中添加如下代码:buildscript {ext.kotlin_version ='1.2.30' //kotlin版本ext.anko_version ='0.8.2' //anko是方便kotlin开发android的库,不需要findById()...repositories {jcenter()goo...

weixin_32462499的博客 638
上一篇: Kotlin在Android上的运用(二)
下一篇: Kotlin在Android上的运用(四)
豪豪6
博客等级 码龄14年 6粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值