上次我们学习了kotlin的字符串操作、数字类型、标准库函数,接下来我们来学习集合,和其他变量类型一样,集合也分为可变和只读 一、List 1.List集合创建与元素获取 调用listOf函数创建集合,...: "is null") } kotlin还支持利用toList和toMutableList函数实现可变和只读列表的转换 fun main() { //调用mutableListOf创建可变list...= list.toMutableList() } kotlin支持和c/c++一样的运算符重载,所以我们可以用 +号 代替 add函数, - 号 代替 remove函数 fun main() {....解构 之前我们提到过,kotlin允许在一个表达式中给多个变量赋值 可以用"_"过滤不想要的元素 fun main() { //调用mutableListOf创建可变list val...val set = setOf("张三", "李四", "王五") println(set.elementAt(1)) } 2.可变Set 通过mutableSetOf创建,其他的和
Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java 类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API 都在 kotlin.collections...另外,在Kotlin中集合类不仅仅能持有普通对象,而且能够持有函数类型的变量。...Map 映射 Map 映射与Set 集或List 列表的区别是:Map 映射中每个项都是成对的。...在 Map 映射表中 key(键)是唯一的 MutableMap 支持添加和删除元素的Map 7.2 不可变集合类 List 列表分为只读不可变的 List 和 可变 MutableList (可写入删除数据...() 、mutableMapOf() 来创建可变的 MutableList 列表、MutableSet 集、MutableMap 映射表。
介绍 同样在Kotlin中会有List、Map、Set,而与Java中数据结构大多相同,也略有区别。Kotlin中的集合分为可变集合与不可变集合。...List及其遍历 Kotlin的List接口只提供了size、get、indexOf等接口。所以我们在写代码之前需要先知道这个List使用的时候会变还是不会变。...创建可变与不可变的List 在Kotlin中都是通过标准库来创建集合类,例如: 创建可变List:通过mutableListOf(),返回MutableList对象 创建不可变List:通过listOf...// 创建List不能添加和删除只能遍历 var immutableList: List = listOf(1, 2) } } List的遍历 在Kotlin中的遍历和...var first = mutableList.first { it == 3 } } } 在Kotlin的闭包中,可以使用很多方式来指定参数,如果没有指定参数的话
Kotlin的集合类分为:可变集合类(Mutable)与不可变集合类(Immutable)。 集合类型主要有3种:list(列表)、set(集)、和 map(映射)。...(1)列表 列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。 列表在数据结构中可表现为:数组和向量、链表、堆栈、队列等。...通过对集中的对象迭代,我们可以得到一个升序的对象集合。 (3)映射 映射与集或列表有明显区别,映射中每个项都是成对的。...class java.util.ArrayList 关于Kotlin中的ArrayList类型别名定义在 kotlin/collections/TypeAliases.kt 文件中: @file:kotlin.jvm.JvmVersion...列表的长度取两个集合中最短的。
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。...为方便理解循环适配器的Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码: //ViewHolder在构造时初始化布局中的控件对象 class RecyclerLinearAdapter...注意到适配器代码仍然通过findViewById方法获得控件对象,可是号称在Anko库的支持之下,Kotlin早就无需该方法就能直接访问控件对象了呀,为啥这里依旧靠老牛拉破车呢?...这么神奇的魔法,快来看看Kotlin的适配器代码是如何书写的: //利用Kotlin的插件LayoutContainer,在适配器中直接使用控件对象,而无需对其进行显式声明 class RecyclerStaggeredAdapter...的扩展插件,所以需要修改模块的build.gradle,在文件末尾添加下面几行配置,表示允许引用安卓插件库: androidExtensions { experimental = true }
,会根据构造器中声明的属性自动推断出equals方法,在kotlin中equals方法等同于双等号“==”,而双等号在Java中是比较引用(地址)是否相等,在kotlin中需要使用三等号“===”。...如果 when 被用作表达式, 则必须有 else 分支, 除非编译器能够证明其他分支的条件已经覆盖了所有可能的情况 循环和lambda 假设有个User列表,然后找出年龄小于20岁的部分: fun...(it) } } 其实我们还能简化,kotlin中的容器类提供过滤的函数filter(),他会直接返回符合条件的集合: val youngPersonList = users.filter...{ it.age < 20 } kotlin还提供了一个过滤函数partition,他可以返回两个集合,一个是满足条件的,另一个是不满足条件的: val (youngPersonList,...,比如我觉得MutableList应该具备可以任意交换数据的函数,那我们就可以自己为MutableList类扩展一个这样的函数,然后我们就可以在所有MutableList的对象中使用这个函数:
作为调用其他函数的类型实参 * * 不能做下面的事情: * - 创建指定为类型参数的类的实例 * - 调用类型参数类的伴生对象的方法...(source: kotlin.collections.MutableList, destination: kotlin.collections.MutableList) {...* Kotlin中的 MutableList 和 Java中的 MutableList 是一个意思。...在Kotlin 中的 只读接口 List 声明成了协变的,这 意味着 List 的子类型。...在Kotlin 中既可以为整个泛型类指定变型(声明点变型),也可以为泛型类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。
而情况到了Kotlin里面,就完全不一样了——我们完全可以自由扩展任何类的方法和属性。在不修改原类的情况下, Kotlin能给一个类扩展新功能而无需继承该类。...()) // a println(str.lastChar()) // c } 如果在其他package路径下面,需要 import 导入扩展函数 package com.easy.kotlin.tutorial...list.filter { it % 2 == 1 } 答案是肯定的,只不过是在Kotlin中,而不是在Java中。...kotlin文件中,不允许定义在函数中。...同时也正是通过这个特性,Kotlin 在Java API的基础上扩展了丰富实用的函数,我们将在后面的章节中看到。
fun doSomething(name: String, func: (e: String) -> Unit) { func(name) } Kotlin的lambda表达式还有一项特性,指定接收器...语法就是在lambda表达式的括号前添加接收器和点号.。在指定了接收器的lambda表达式内部,我们可以直接调用接收器对象上的任意方法,不需要额外的前缀。...这里属性和子标签都声明为了MutableList类型,它是Kotlin类库中的可变列表,存储内容是可以修改的。最后的文本类非常简单,直接返回文本。...doInit工具方法中,子元素被添加到的标签正是这里定义的上下文。因为tr标签既可以在thead标签中使用,也可以在tbody标签中使用。...如果技术够硬的话,你甚至可以自己做一个脚本语言或者其他什么东西。当然现在已经有项目开始使用这种语法了,例如Kara Web框架视图以及用Kotlin写Gradle脚本。
final对于Java开发者来说并不陌生,但也必然说不上"常用",可在Kotlin里其地位却上升为定义变量的"关键词",这也说明"可变"与"不可变"的概念已经深刻在Kotlin的基因里了。...因此在Kotlin里,开发者最惦记的Collections同样划分为"可变集合"(Mutable Collections)和"不可变集合"(Immutable Collections)。...Kotlin代码要实现100%兼容Java,则无论穿的衣服是 MutableList还是 ImmutableList,卸下伪装后都只能是Java的 List。...共享的数据 在翻看源码实现的时候,发现了一个比较奇怪的地方,那就是其数据的保存方式。下面同样以 PersistentVector为例。 直接上图: ?...,都将有一部分是共享的,这将能节省不少内存,同时能让用户在极小负担下对列表进行修改。
在 Kotlin 中使用:代替 extends 对泛型的的类型上界进行约束。...1.1 Upper bounds 下面的代码,在调用 sum() 函数时,传入的参数只能是 Number 及其子类,如果是其他类型,则会报错。...是 Any 的超类型,所以 Kotlin 默认的上界是Any? 1.2 where 关键字 当一个类型参数指定多个约束时,在 Java 中使用&连接多个类、接口。...类型投影(Type projections) 在上一篇文章>中,曾经介绍过 MutableList 是不变的,可读可写,没有使用 in、out 修饰。...而使用 in 时,编译可以通过,因为该参数只能出现在方法的入参。 此时,list2 和 list3 分别表示一个受限制的 MutableList。在 Kotlin 中,这种行为被称之为类型投影。
和 final 的,如果需要不是 final 的需要显式说明 open Java 中的默认级别是 package-level,同一个包内其他类可见,这个在 Kotlin 中叫做 internal override...在 Kotlin 中是强制的,避免意外 override protected 在 Java 中仍然对同一个包内的其他类可见,在 Kotlin 中只对子类可见 private 针对类来说就是私有类,对于...top-level declaration 是对同一个文件中的其他部分可见 internal 在 JVM 的层面 public + name mangled Java 中每一个类需要是单独的类,而 Kotlin...,这样就可以在自己的算法中用新的比较规则,这个规则在代码的其他部分是不可见的 内联函数 run 会运行一个 Lambda 代码段,并把最后一个表达式作为结果 let 可以检测一个参数是不是 nulll...[1, 2, 3, 4] 在底层,kotlin.List 有一个子类 kotlin.MutableList,而 kotlin.MutableList 会用 java.util.ArrayList 来实现
可变列表集合 ---- 使用 listOf 函数 创建的 List 集合 是 只读列表集合 ; 使用 mutableListOf 函数 创建的 MutableList 集合 是 可变列表集合 ; 调用...MutableList#toList 函数 , 可以 将 可变列表集合 转为 只读列表集合 ; 调用 List#toMutableList 函数 , 可以 将 只读列表集合 转为 可变列表集合 ; 代码示例...("Jack") // 删除元素 mutableList.remove("Tom") println(mutableList) // 将 可变列表集合 转为 只读列表集合...val list: List = mutableList.toList() // 将 只读列表集合 转为 可变列表集合 val mutable: MutableList...(name in list) { println("for : $name") } forEach 遍历 : /** * 在每个元素上执行给定的[action]。
在Kotlin中,过滤条件由谓词定义,指接受一个集合元素并且返回布尔值的 lambda 表达式:true说明给定元素与谓词匹配,false则表示不匹配。...13.1、添加元素 add() 要将单个元素添加到列表或集合,请使用 add() 函数。指定的对象将添加到集合的末尾。...参数集合的第一个元素会被插入到这个位置。 其他元素将跟随在它后面,将接收者元素移到末尾。...14.4.1、添加 要将元素添加到列表中的特定位置,请使用 add() 或 addAll() 并提供元素插入的位置作为附加参数。 位置之后的所有元素都将向右移动。...asReversed() 在可变列表上调用会返回另一个可变列表,该列表是原始列表的反向视图。在该视图中的更改将反映在原始列表中。
定义函数 完整的 Kotlin 方法定义语法为 [访问控制符] fun 方法名(参数列表) [:返回值类型] {} Kotlin 可以省略变量定义的类型声明,但是在定义参数列表和定义返回值类型时则必须明确指定类型...原始字符串可以包含换行符和任何其他字符。...而改变 list 的方法是由 MutableList 加入的。... = mutableListOf(1, 2, 3) 创建一个初始化元素1,2,3的元素类型为Int的MutableList可变List。...使用 val result = mutableListOf() 创建一个空的MutableList元素类型为String的可变List。
:【读书笔记】《Kotlin in Action》学习笔记(上) 另外,关于我在 mobilehub 微信留言中免费获赠中文版《 Kotlin 实战》书籍的留言我也贴上,当时我回答的时候一方面想着能意外收获一本书...首先看原始版本,拷贝一个列表到另一个: fun copyDataVersion1(source: MutableList, destination: MutableList) {...当然没有, Kotlin 提供了一个更加优雅的解决方案,不信你看看下面的代码: fun copyDataVersion3(source: MutableList, destination...} 4、 Kotlin 中 DSL 使用带有 object 参数的中缀函数 我只想说,“厉害了,我的 Kotlin 哥”!..."kotlin".should(start).with("kot") 没错,但是他的精髓你发现了没?精髓在于 start 的妙用!
String类型,在Kotlin中这表示它必须包含一个String实例) // strLen(null) // 如果允许调用这个方法的时候传给它所有的可能的实参,包括null...} // 只在泛型类的时候会被编译成Integer,如集合类,其他是int // 对应到Java基本数据类型的类型完整列表如下: /* *...的集合设计和Java不同的另一项重要特质是,它把访问集合数据的接口和修改集合数据的接口分开了。...Java 中的类型在 Kotlin 中被解释成平台类型,允许开发者把它们当作可空或非空来对待。 表示基本数字的类型(如 Int )看起来用起来都像普通的类,但通常会被编译成 Java 基本数据类型。...当你在 Kotlin 中继承 Java 类或者实现 Java 接口时,你需要仔细考虑参数的可空性和可变性。 Kotlin的Array 类就像普通的泛型类 但它会被编译成 Java 数组。
Kotlin号称全面兼容Java,于是乎Java的容器类仍可在Kotlin中正常使用,包括大家熟悉的队列ArrayList、映射HashMap等等。...不过Kotlin作为一门全新的语言,肯定还是要有自己的容器类,不然哪天Java跟Kotlin划清界限,那麻烦就大了。...初始化赋值 : Kotlin允许在声明容器变量之时进行初始赋值,这点很方便比Java先进,当然不同容器的初始化方法有所区别,具体的对应关系见下表: 只读集合Set setOf 可变集合 ...只读队列List/可变队列MutableList 队列是一种元素之间按照顺序排列的容器,它与集合的最大区别,便是多了个次序管理。...2、MutableList的add方法每次都是把元素添加到队列末尾,也可指定添加的位置; 3、MutableList的set方法允许替换或者修改指定位置的元素; 4、MutableList的removeAt
buildFeatures { dataBinding true } } 同时在插件中添加 kotlin-kapt的插件,如下: plugins { id 'com.android.application...' id 'org.jetbrains.kotlin.android' // 添加 kotlin-kapt 插件 id 'kotlin-kapt' } 配置完成后,点击 Sync...BaseBindingActivity、BaseBindingViewModelActivity、BaseFragment、BaseBindingFragemnt、BaseBindingViewModelFragment 关于其他几个基类的使用见...:Android基于DataBinding+Koin实现MVVM模式页面快速开发框架 2.3 申请失败处理 只需在请求时传入 onDenied回调即可进行权限申请失败的处理,如下: // 要申请的权限列表...,再次申请权限将不再弹出用户允许权限的弹框,此时只能引导用户在系统的应用设置里手动开启应用的相关权限,ardf也对该场景做了封装,只需在申请时传入 showPermanentlyDeniedDialog
在集合类API中大量地使用了泛型。在Java 中我们可以为类、接口和方法分别定义泛型参数,在Kotlin中也同样支持。本节我们分别介绍Kotlin中的泛型接口、泛型类和泛型函数。...extends Fruit> 是 MutableList 的父类型。 Kotlin中使用 MutableList 来表示。 超类型下界限定符 ?...Kotlin中使用 MutableList 来表示。 这里的问号 (?) , 我们称之为类型通配符(Type Wildcard)。...JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。 关于泛型的很多奇怪特性都与这个类型擦除的存在有关,比如:泛型类并没有自己独有的Class类对象。...对应地在Kotlin中并不存在MutableList::class, 而只有 MutableList::class 。
领取专属 10元无门槛券
手把手带您无忧上云