Kotlin在Android上的运用(四)

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

13.Introduction

Kotlin提供了一系列的to方法将一个集合类型转换成另外一个集合类型。

这一部分的第一个任务很简单,根据提示就可以完成,关于任务就不必多说。

先说明一下第二部分所有任务的数据模型。这一部分所有的任务都是围绕一个商店(Shop)展开,商店有一个客户(Customer)列表。

客户具有姓名、城市和订单(Order)列表三个属性。

订单具有商品(Product)列表和是否已经发货两个属性。

商品具有名称和价格两个属性。

data class Shop(val name: String, val customers: List<Customer>)

data class Customer(val name: String, val city: City, val orders: List<Order>) {
    override fun toString() = "$name from ${city.name}"
}

data class Order(val products: List<Product>, val isDelivered: Boolean)

data class Product(val name: String, val price: Double) {
    override fun toString() = "'$name' for $price"
}

data class City(val name: String) {
    override fun toString() = name
}

第二部分所有的任务都是使用扩展函数的形式完成。

14.Filter Map

这个任务主要练习使用filter 和 map这两个方法。

filter

filter方法返回一个包含所有满足指定条件元素的列表。与之对应的还有filterNot,顾名思义就是返回一个包含所有不满足指定条件的元素列表。还有一个filterNotNull,返回所有不为null的元素列表。

回到我们的任务要求:返回指定城市所有客户的列表。使用filter方法就可以完成:

fun Shop.getCustomersFrom(city: City): List<Customer> {
    // Return a list of the customers who live in the given city
    return customers.filter{it.city == city}
}

再精简一下:

// Return a list of the customers who live in the given city
fun Shop.getCustomersFrom(city: City) = customers.filter{it.city == city}
map

map就是将指定的转换函数运用到原始集合的每一个元素,并返回一个转换后的集合。

任务要求返回所有客户所在城市的Set。这里我们需要使用map 和toSet两个方法:

// Return the set of cities the customers are from
fun Shop.getCitiesCustomersAreFrom() = customers.map { it.city }.toSet()

15.All Any and others Predicates

这个任务主要练习all ,any和count等几个方法。

all

第一个小任务是判断是否所有的客户都来自指定的城市。这需要使用Kotlin库提供的all方法。如果所有的元素都满足指定的条件那么all方法就返回true:

// Return true if all customers are from the given city
fun Shop.checkAllCustomersAreFrom(city: City): Boolean {
    //return customers.filter { it.city != city }.isEmpty()
    //return customers.filter{!it.isFrom(city)}.isEmpty()
    return customers.all { it.isFrom(city) }
}

当然也可以不使用all来完成,不过效率可能没有all高,因为all方法在遍历的过程中遇到第一个不满足条件的元素就返回结果(false):

// Return true if all customers are from the given city
fun Shop.checkAllCustomersAreFrom(city: City) = customers.filter{!it.isFrom(city)}.isEmpty()
any

第二个小任务就是查询是否至少存在一个用户来自指定的城市。需要使用any方法,如果至少有一个元素满足指定的条件any就返回ture:

// Return true if there is at least one customer from the given city
fun Shop.hasCustomerFrom(city: City) = customers.any{it.city==city}
count

第三个小任务计算来自指定城市的客户数量。需要使用count方法,count方法返回满足指定条件的元素数量。

fun Shop.countCustomersFrom(city: City): Int {
    // Return the number of customers from the given city
    return customers.count{ it.city == city}
}

firstOrNull

最后一个小任务,返回一个来自指定城市的客户,如果没有就返回null。需要使用firstOrNull方法,该方法返回第一个满足指定条件的元素,如果没有就返回null。和它相似的还有first,不过first是返回第一个满足指定条件的元素,如果没有元素满足指定条件则抛出异常NoSuchElementException。

// Return a customer who lives in the given city, or null if there is none
fun Shop.findAnyCustomerFrom(city: City) = customers.firstOrNull { it.city == city }

16.FlatMap

这个任务的两个小项都是练习使用flatmap方法。flatmap方法就是针对列表中的每一项根据指定的方法生成一个列表,最后将所有的列表拼接成一个列表返回。

第一个小项是要求返回一个客户所有已订购的产品,需要使用flatmap方法,遍历该用户所有的订单,然后将所有订单的产品拼接起来:

val Customer.orderedProducts: Set<Product> get() {
    // Return all products ordered by customer
    return orders.flatMap { it.products }.toSet()
}

第二个小项是要求返回所有至少被一个客户订购过的商品集合。这个在第一个小任务的基础上再flatmap一次:

val Shop.allOrderedProducts: Set<Product> get() {
    // Return all products that were ordered by at least one customer
    return customers.flatMap { it.orderedProducts }.toSet()
}

17.Max Min

第一个任务是返回商店中订单数目最多的一个客户。使用Kotlin库提供的max方法很好实现。max方法返回最大的一个元素,如果没有元素则返回null。对于自定义的对象,我们可以通过maxBy方法提供最大的评判标准,maxBy方法返回第一个满足指定评判标准的最大值。

fun Shop.getCustomerWithMaximumNumberOfOrders(): Customer? {
    // Return a customer whose order count is the highest among all customers
    return customers.maxBy { it.orders.size }
}

第二个任务是要求返回一个客户所订购商品中价格最高的一个商品,使用flatmap 和 maxBy组合:

fun Customer.getMostExpensiveOrderedProduct(): Product? {
    // Return the most expensive product which has been ordered
    return orders.flatMap { it.products }.maxBy { it.price }
}

当然和max 和maxBy对应的还有min和minBy,只不过返回的是最小值。

18.Sort

Kotlin库提供了为元素排序的方法sorted。sorted方法会返回一个升序排序的列表,同样可以通过sortedBy指定排序的标准,按照指定的标准排序。

任务的要求返回一个客户列表,客户的顺序是根据订单的数量由低到高排列:

fun Shop.getCustomersSortedByNumberOfOrders(): List<Customer> {
    // Return a list of customers, sorted by the ascending number of orders they made
    return customers.sortedBy { it.orders.size }
}

对于排序操作同样可以要求按照降序排序,两个方法分别是:sortedDescending和sortedByDescending。

还有另外一个操作方法就是反转reverse。

19.Sum

任务要求计算一个客户所有已订购商品的价格总和。使用Kotlin的sumBy方法就可以完成,sumBy将集合中所有元素按照指定的函数变换以后的结果累加。当然先要将所有的订单flatmap:

fun Customer.getTotalOrderPrice(): Double {
    // Return the sum of prices of all products that a customer has ordered.
    // Note: a customer may order the same product for several times.
   return  orders.flatMap { it.products }.sumByDouble { it.price }
}

20.GroupBy

groupBy方法返回一个根据指定条件分组好的map。任务要求是返回来自每一个城市的客户的map:

fun Shop.groupCustomersByCity(): Map<City, List<Customer>> {
    // Return a map of the customers living in each city
    return  customers.groupBy { it.city }
}

21.Parition

任务要求返回所有未发货订单数目多于已发货订单的用户。

任务的范例中展示了怎么使用partition方法。partition方法会将原始的集合分成一对集合,这一对集合中第一个是满足指定条件的元素集合,第二个是不满足指定条件的集合。

这里我们先给Customer定义一个函数,判断该用户是否属于未发货订单大于已发货订单,处理方法就是使用partition方法将所有的订单分割,分割的条件就是该订单已经发货:

fun Customer.isMoreUndeliveredOrdersThanDelivered(): Boolean{
    val(delivered, undelivered) = orders.partition { it.isDelivered }
    return delivered.size < undelivered.size
}

然后再对所有的客户进行筛选:

fun Shop.getCustomersWithMoreUndeliveredOrdersThanDelivered(): Set<Customer> {
    // Return customers who have more undelivered orders than delivered
    return customers.filter { it.isMoreUndeliveredOrdersThanDelivered() }.toSet()
}

将这两个函数写到一起:

fun Shop.getCustomersWithMoreUndeliveredOrdersThanDelivered() =
        customers.filter {
            val(delivered, undelivered) = it.orders.partition { it.isDelivered }
            undelivered.size > delivered.size 
        }.toSet()

22.Fold

任务要求返回每一个顾客都购买过的商品集合。

先来看一下fold方法,fold方法就是给定一个初始值,然后通过迭代对集合中的每一个元素执行指定的操作并将操作的结果累加。注意操作函数的两个参数分别是累加结果和集合的元素。

直接看fold函数的定义吧:

public inline fun <T, R> Iterable<T>.fold(initial: R, operation: (R, T) -> R): R {
    var accumulator = initial
    for (element in this) accumulator = operation(accumulator, element)
    return accumulator
}

回到我们的任务,使用fold函数,由于任务要求返回所有客户都已经订购的商品,所以初始值设置为所有已经订购的商品,然后用这个初始值去和每一个客户已订购的商品求交集,最终的结果就是所有用户都已经购买过的商品:

fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
    // Return the set of products ordered by every customer
    return customers.fold(allOrderedProducts, {
        orderedByAll, customer -> orderedByAll.intersect(customer.orderedProducts)
    })
}

这里使用了Kotlin提供的intersect方法。

23.CompoundTasks

终于快结束这一部分的任务了。这一部分包括几个小任务,完成任务需要用到前面所练习的各种方法的组合。

来看第一个小任务:返回所有购买了指定商品的客户列表。首先给Customer扩展一个方法,判断他是否已经订购指定的商品,使用any方法:

fun Customer.hasOrderedProduct(product: Product) = orders.any{it.products.contains(product)}
然后根据他是否已经订购指定商品来做过滤:

fun Shop.getCustomersWhoOrderedProduct(product: Product): Set<Customer> {
    // Return the set of customers who ordered the specified product
    return customers.filter { it.hasOrderedProduct(product) }.toSet()
}

第二个小任务:查找某个用户所有已发货的商品中最昂贵的商品。首先过滤出已发货的订单,然后flatmap,再求最大值:

fun Customer.getMostExpensiveDeliveredProduct(): Product? {
    // Return the most expensive product among all delivered products
    // (use the Order.isDelivered flag)
    return orders.filter { it.isDelivered }.flatMap { it.products }.maxBy { it.price }
}

第三个小任务:查找指定商品被购买的次数。首先获取到客户所有已订购的商品列表,使用flatmap:

fun Customer.getOrderedProducts() = orders.flatMap { it.products }
然后继续flatmap,将所有客户已经订购的商品组成一个列表,最后再count:

fun Shop.getNumberOfTimesProductWasOrdered(product: Product): Int {
    // Return the number of times the given product was ordered.
    // Note: a customer may order the same product for several times.
    return customers.flatMap { it.getOrderedProducts() }.count{it == product}
}

将两个函数组合到一起:

    // Return the number of times the given product was ordered.
    // Note: a customer may order the same product for several times.
fun Shop.getNumberOfTimesProductWasOrdered(product: Product) 
= customers.flatMap { it.orders.flatMap { it.products } }.count{it == product}

24.Extensions On Collections

最后一个任务,就是实现 _24_JavaCode.doSomethingStrangeWithCollection函数的功能。所以先读懂_24_JavaCode.doSomethingStrangeWithCollection的意图:

public class _24_JavaCode extends JavaCode {
    public Collection<String> doSomethingStrangeWithCollection(Collection<String> collection) {
        Map<Integer, List<String>> groupsByLength = Maps.newHashMap();
        for (String s : collection) {
            List<String> strings = groupsByLength.get(s.length());
            if (strings == null) {
                strings = Lists.newArrayList();
                groupsByLength.put(s.length(), strings);
            }
            strings.add(s);
        }

        int maximumSizeOfGroup = 0;
        for (List<String> group : groupsByLength.values()) {
            if (group.size() > maximumSizeOfGroup) {
                maximumSizeOfGroup = group.size();
            }
        }

        for (List<String> group : groupsByLength.values()) {
            if (group.size() == maximumSizeOfGroup) {
                return group;
            }
        }
        return null;
    }
}

将一个字符串集合按照长度分组,放入一个map中
求出map中所有元素(String List)的最大长度
根据步骤2的结果,返回map中字符串数目最多的那一组
Kotlin的实现,首先根据长度分组,然后求最大值:

fun doSomethingStrangeWithCollection(collection: Collection<String>): Collection<String>? {
    val groupsByLength = collection.groupBy { it.length }

    return groupsByLength.values.maxBy { it.size }
}

精简一下:

fun doSomethingStrangeWithCollection(collection: Collection<String>) =
        collection.groupBy { it.length }.values.maxBy { it.size }
一款纯 Kotlin 编写的开源安卓应用 "Smile" 我从对 Kotlin 一窍不通,到完整开发出此 App,共用了 9 天,其中有 4 天只在晚上开发,也就是说共计 5 天 + 4 个晚上。另外由于我对 ui 的挑剔,主题色的挑选及 logo 设计至少占去五分之一的时间。我并不是在炫耀我的自学能力,Smile 的内容并不算多,肯定有很多大牛比我快,我想表达的是这 9 天的学习及开发过程是刀过竹解、得心应手的。所以我想把这个学习过程分享给大家,只要能帮到一个人,那就是有 阅读详情

相关推荐

Kotlin Android 环境搭建

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

lsx202406的博客 1390

Android开发-关于排序问题

想要对接口返回的列表数据进行自定义排序。

Ai_wen_的博客 483

PX4二次开发实战:从零构建自定义飞控模块

本文详细介绍了PX4二次开发的实战指南,从环境搭建到自定义飞控模块的创建,涵盖了uORB消息定义、外部传感器驱动集成、控制算法实现等关键步骤。通过具体代码示例和调试技巧,帮助开发者快速入门PX4二次开发,构建高效稳定的无人机飞控系统。

weixin_29175469的博客 339

Kotlin sortBy 、sortedBy、sortedWith、sortWith区别

源码 import kotlin.test.* fun main(args: Array<String>) { val list = mutableListOf("aaa", "cc", "bbbb") val sorted = list.sortedBy { it.length } println(list) // [aaa, cc, bbbb] println(sorted) // [cc, aaa, bbbb] list.sortBy{ it.length} println(list

爱孔孟 6759

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6563

apache 403错误 Forbidden解决方法

当网页打开提示以下错误时,即出现了403错误。 Forbidden You don't have permission to access / on this server. 403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。通常情况可能(但不限于此)的原因有: 原因1:apache配置文件中没有对站点目录的权限许可,这通...

lmseo5hy的博客 1495

kotlin的groupBy用法

【代码】kotlin的groupBy用法。

shenmohui的博客 1343

NetSuite软件二次开发:NetSuite二次开发最佳实践与案例分析

SuiteScript是NetSuite提供的一种用于二次开发的脚本语言,它基于JavaScript,但添加了特定的API和框架,以支持NetSuite平台的业务逻辑开发。SuiteScript有两种版本:SuiteScript 1.0和SuiteScript 2.0,后者提供了更现代的面向对象编程模型,增强了代码的可读性和可维护性。NetSuite允许用户自定义字段以满足特定的业务需求。这些字段可以添加到现有的记录类型中,也可以用于自定义记录。自定义字段可以是文本、数字、日期、下拉列表等多种类型。

kkchenjj的博客 1465

Android:Kotlin语法基础

主函数 fun main(args: Array<String>){ println("Hello World") } 复制代码变量 1、常量 val修饰常量,编译器规定常量必须初始化,若不想初始化,可用**by lazy{}**对常量进行懒加载 val a: Int = 1 // 强类型常量 val b = 2 ...

weixin_33893473的博客 903

使用YubiKey进行全盘加密、加密启动分区以及利用UEFI安全启动的详细指南

在本教程中,我们将使用YubiKey来增强电脑的安全性,通过加密整个硬盘,确保只有持有正确YubiKey的人才能访问。UEFI安全启动是一种在UEFI固件级别实施的安全标准,确保计算机仅启动签名的启动加载程序。为了符合您的要求,我将以此方式分配内容,确保每部分都有详尽的说明和代码。现在,您已经成功地使用YubiKey设置了全盘加密,并使用UEFI安全启动为系统增加了额外的安全层。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。

qq_38334677的博客 1006

openHarmony之AI Engine:万字讲解如何在应用、开发板上接入AI大模型调用

本文章介绍如何在 OpenHarmony 开发板上集成和部署各类 AI 大模型,实现终端直接聊天功能,并为语音助手、智能机器人等应用提供 AI 接口支持。

m0_67505153的博客 619

Kotlin 15. Kotlin List 的使用 2:associateBy,groupBy,partition,flatMap,minOrNull,sorted,zip

介绍一系列 Kotlin List 函数用法,包括:- filter - map - count - first,last - any, all, none - find,findLast - associateBy, groupBy - partition - flatMap - minOrNull, maxOrNull - sorted,sortedBy - zip - getOrElse

破浪会有时的博客 2345

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 681

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

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

u014773418的专栏 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

gitblog_00634的博客 832

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

BlackSmith 3336

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

我的博客 6055

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

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

8348

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

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

weixin_39581739的博客 514

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 高级教程(四)

原文:Pro Android with Kotlin 协议:CC BY-NC-SA 4.0 十、开发 与前几章相比,本章涉及的问题更接近于开发问题。我们将在这里讨论的主题与特定的 Android 操作系统 API 没有太紧密的联系。我们更关心的是如何使用 Kotlin 方法最好地完成技术需求。 这一章还有一节介绍了如何将 Kotlin 代码转换成可以服务于WebView小部件的 JavaScript 代码。 用 Kotlin 编写可重用库 你在网上找到的大多数教程都是关于活动、服务、广播接收器和内容供应

龙哥盟 1284

Kotlin 开发Android app(一):Kotlin 建立Android工程

产品会不断的迭代更新,其实编程语言也是一样的,开发Android的新语言Kotlin是简便了很多,我们不需要写太多无用的带来,来实现同样的功能,这来自于Kotlin语言的特性,Kotlin有什么简便的地方,我们后面会通过每一小节来强调他的用法。就这么开始我们Kotlin下的App开发吧。

haleycat的博客 5045

从零开始学安卓(kotlin)四——kotlin

目录with函数run函数(最后一行代码作为返回值返回)apply函数(调用对象相同、调用方法相同)定义静态方法顶层方法 with函数 这两段代码的执行结果是一模一样的,但是明显第二段代码的写法更加简洁一些,这就是with函数的作用。 val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape") val builder = StringBuilder() builder.append("Start eating fruits.\n") for

qq_43480289的博客 933

【安卓开发】Kotlin入门教程

Kotlin 是一种由 JetBrains 开发的静态类型编程语言,运行在 Java 虚拟机上,也可以编译为 JavaScript 或原生代码。它于 2017 年被 Google 宣布为 Android 官方开发语言。主要特点:简洁:相比 Java 减少约 40% 的样板代码安全:内置空安全机制互操作:100% 兼容 Java工具友好:由 JetBrains 开发,IDE 支持完善。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值