kotlin - 基础

作者: 前行的乌龟 | 来源:发表于2019-02-20 20:53 被阅读3次

kotlin 一直我只是记录实际写法,但是我发现有些点总是忘,不写不行了,所以下面我记录的是容易忘或是忽略的部分

基础数据类型

  • kotin 对应的基本数据类型如下:


  • 在 kotlin 中没有 java 的数据类型默认转换,所有的 kotlin 基本数据类型必须显示的手动转换
  • kotlin支持十进制(123),十六进制(0x0F),二进制(0b00001011),不支持八进制
  • 1.1 起允许使用下划线,使数字常量更易读
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

== / ===

kotlin 的 == 等同于 .equals , === 是引用比较

var book11: Book = Book("book")
var book12: Book = Book("book")

Log.d("BBB", " book11  == book12 : " + (book11 == book12))
Log.d("BBB", " book11  === book12 : " + (book11 === book12))
02-20 15:53:36.856 13992-13992/com.bloodcrown.kotlintest D/BBB:  book11  == book12 : true
02-20 15:53:36.856 13992-13992/com.bloodcrown.kotlintest D/BBB:  book11  === book12 : false

字符串模板

val a=10
val s1 = "a is $a"
val s2="a+1 is ${a+1}"

var a: String = "a"
var b: String = "b"
Toast.makeText(this, "$a\n$b", Toast.LENGTH_SHORT).show()

字符串显示格式

kotlin 对于 字符串显示 有自己的套路

直接换行+空格,不用再加转意符了,直接写成我们想要的文本格式

        var a: String = "a"
        var b: String = "b"
        var c: String = """
                            $a
                            $b
                        """
        Toast.makeText(this, c, Toast.LENGTH_SHORT).show()

用 trimMargin 去掉 | 标记的行空格

        var a: String = "a"
        var b: String = "b"
        var c: String = """
                            |$a
                            $b
                        """.trimMargin()
        Toast.makeText(this, c, Toast.LENGTH_SHORT).show()


支持嵌套注释

/* 这是一个多行的
   块注释。 */
Kotlin块注释支持嵌套,代码如下:

/* 
这是一个多行的
块注释。
    /*再嵌套一个
      块注释 */
*/

条件表达式

kotlin 的条件表达式可以充当返回值

fun maxOf(a: Int, b: Int) = if (a > b) a else b

Unit

Unit 表示 method 没有返回值,一般我们可以不用写 Unit ,但是有的时候我们必须写,记住这个单词

fun abc(): Unit{}

null 操作

val name: String?
name = if(Random.nextBoolean()) "Ann" else null

//加上?则只在name不为null的时候会调用,得到的len1类型也是有问号的,即Int?
val len1 = name?.length

// ?: 相当于添加默认值
val len2 = name?.length?:0

//加上双感叹号其实就是java什么都不加的写法了,如果为null会报空指针异常
val len3 = name!!.length

when 函数

kotlin 的 when 支持任何数据类型,不想 java 只支持 int;另一个是 kotlin 的 when 在满足条件的分支执行后,会终止 when 语句执行,所以不用像 switch 语句那样每一个 case 都加上 break

        // 标准样式
        var a = 0
        when (a) {
            0 -> { }
            1 -> { }
            else -> { }
        }

        // 支持任意类型
        when (obj) {
            1 -> "One"
            "Hello" -> "Greeting"
            is Long -> "Long"
            !is String -> "Not a string"
            else -> "Unknown"
        }

        // 可以是表达式
        val items = setOf("apple", "banana", "kiwi")
        when {  //when中内容省略了
            "orange" in items -> println("juicy")
            "apple" in items -> println("apple is fine too")
        }

in 范围

kotlin 特性,in 可以指定范围,也可以参与 if 判断在不在


        // 参与 if 判断,判断在不在
        val list= setOf("apple", "banana", "kiwi")

        var name:String = ""
        if ( name in items ) {}

        // 遍历 1 - 5 ,数据全包,含开始和结尾数据
        for (x in 1..5) { print(x) }
      
        // step 指定步长
        for (x in 1..10 step 2) { print(x) }

        // downTo 指定递减
        for (x in 9 downTo 0 step 3) { print(x) }

        // until 表示左闭右开区间
        for (i in 1 until 100) { …… }

集合

kotlin 的集合份2种,一种可以修改的,另一个是不能修改的,java 传统的 list,set,map 在 kotin 中都是不能修改的集合类型,能修改的是 mutableList 这样加 mutable 的类型

基础用法:

var list: List<Int> = listOf<Int>()
var set: Set<Int> = setOf<Int>()
var map: Map<String, Int> = mapOf<String, Int>()

var mutableList: MutableList<Int> = mutableListOf()
mutableList.add(1)
mutableList.remove(1)
mutableList.get(2)
mutableList.clear()

var mutableSet: MutableSet<Int> = mutableSetOf()
mutableSet.add(1)
mutableSet.remove(1)
mutableSet.contains(2)
mutableSet.clear()

var mutableMap: MutableMap<String, Int> = mutableMapOf()
mutableMap.put("1", 1)
mutableMap.remove("1")
mutableMap.get("2")
mutableMap.clear()

// 可变和不可变集合转换
val mList: List<Int> = listOf(1, 3, 5, 7, 9)
val mMutableList = mList.toMutableList()

kotlin 可以直接打印集合

        val items = setOf("apple", "banana", "kiwi")
        println( items )

遍历:

        // list 
        val items = listOf("apple", "banana", "kiwi")  //kotlin的一个函数
        for (item in items) { println(item) }
        for (i in items.indices) { println(items[I]) }
        //index是索引,value是值
        for ((index, value) in items.withIndex()) { println("the element at $index is $value")    }

        // map 
        val map = mapOf("a" to "A", "b" to "B", "c" to "C")
        for ((k, v) in map) { println(""+ k + v) }

集合的操作符:

  • retainAll - 取交集
  • contains - 是否包含
  • elementAt / elementAtOrNull / elementAtOrElse - 下标对应的元素,没有就是 null ,带默认值,
  • first / firstOrNull / first(predicate) / firstOrNull (element) - 返回第一个元素或是符合条件的第一个元素
  • last() / lastOrNull / last(predicate) / lastOrNull(predicate) - 返回最后一个元素或是符合条件的最后一个元素
  • single / single(predicate:) / singleOrNull / singleOrNull(predicate) - 判断集合内容是不是唯一,或者取符合条件的单个元素,如果未找到符合的元素或找到多个元素,则返回null
  • indexOf / indexOfFirst(predicate) / indexOfLast(predicate) / lastIndexOf(predicate) - 返回指定或满足条件的元素下标,没有就返回-1
  • any - 如果集合为空,返回false, 集合中存有一个或多个元素时返回true
  • any(predicate) - 如果集合为空或者没有符号条件的元素返回false, 集合中存有一个或多个元素符合条件时返回true
  • all(predicate) - 当且仅当该集合中所有元素都满足条件时,返回true;否则都返回false
  • none - 如果集合中没有元素,则返回true,否则返回false
  • none(predicate) - 如果集合中没有符合匹配条件的元素,返回true,否则返回false
  • count(predicate) - 返回符合匹配条件的元素的个数
  • max, min - 查询最大,最小元素,空集返回null
  • take - 截取指定个数的元素成子集合
  • map - 统一变换处理
  • mapNotNull - 过滤 null 元素
  • reversed - 降序排序
  • sorted / sortedDescending - 升序排序和降序排序
  • sortedBy / sortedByDescending - 可变集合MutableList的升序排序和降序排序
  • zip - 合并元素
  • plus - 合集合

  • retainAll
    取2个集合的交集
val mList1 = mutableListOf(0, 1, 3, 5, 7, 9)
val mList2 = mutableListOf(0, 2, 4, 6, 8, 10)
mList1.retainAll( mList2 )
println( mList1 )
[0]
  • contains
    是否包含指定元素
println(mList1.contains(0))
println(mList1.contains(30))
true 
false
  • elementAt
    查找下标对应的元素
println("下标为5的元素值:${mList1.elementAt(5)}")
下标为5的元素值:5
  • elementAtOrElse
    查找下标对应元素,如果越界会根据方法返回默认值
val mList = mutableListOf(0,1,2,3,4,5)
println(mList.elementAtOrElse(5, {0}))
println(mList.elementAtOrElse(6, {0}))
5 
0
  • elementAtOrNull
    查找下标对应元素,如果越界就返回 null
val mList = mutableListOf(0,1,2,3,4,5)
println(mList.elementAtOrNull(
null

first() 返回集合第1个元素,如果是空集,抛出异常

val mList = mutableListOf(0,1,2,3,4,5)
println(mList.first())
0
  • first(predicate)
    返回符合条件的第一个元素,没有则抛异常
val mList = listOf(1, 2, 3)
println(mList.first { it % 2 == 0 })
2

firstOrNull() 返回集合第1个元素,如果是空集, 对空指针异常处理的函数,如果集合为空,则返回 null

val mList = mutableListOf()
println(mList.first())
null
  • firstOrNull(predicate)
    同上,没有返回 null

  • indexOf
    返回指定元素的下标,没有就返回-1

val mList = listOf(1, 2, 3)
println(mList.indexOf(3))
println(mList.indexOf(0))
2 
-1
  • indexOfFirst(predicate)
    返回第一个符合条件的元素的下标,没有就返回-1 。
val mList = listOf(1, 2, 3)
println(mList.indexOfFirst { it == 2})
1
  • indexOfLast(predicate)
    同上,返回的是最后一个符合条件的元素的下标

  • last() / lastOrNull / last(predicate) / lastOrNull(predicate)
    同 frist ,我就不写啦

  • lastIndexOf(predicate) = indexOfLast(predicate)

  • single / single(predicate:) / singleOrNull / singleOrNull(predicate:)
    又是一长串,基础是判断集合内容是不是唯一,加上条件就是取符合条件单个元素,如果未找到符合的元素或找到多个元素,则返回null

  • any
    判断集合元素,如果集合为空,返回false,

val mList1 = arrayListOf(1, 2, 3, 4, 5)
val mList2: ArrayList<Int> = arrayListOf()
println(mList1.any())
println(mList2.any())
true 
false
  • any(predicate)
    判断集合元素,如果集合为空或者没有符号条件的元素返回false, 集合中存有一个或多个元素符合条件时返回true
val mList = arrayListOf(1, 2, 2, 3, 4, 5)
println(mList.any { it == 2})
true
  • all(predicate)
    当且仅当该集合中所有元素都满足条件时,返回true;否则都返回false。
val mList = arrayListOf(0, 2, 4, 6, 8)
println(mList.all { it % 2 == 0 })

val mList = arrayListOf(0, 1, 2, 3, 4)
println(mList.all { it % 2 == 0 })
true
false
  • none
    如果集合中没有元素,则返回true,否则返回false。
val mList = arrayListOf(0, 1, 2, 3, 4)
println(mList.none())
false
  • none(predicate)
    如果集合中没有符合匹配条件的元素,返回true,否则返回false 。
val mList = arrayListOf(0, 1, 2, 3, 4)
println(mList.none { it == 5 })
true
  • count(predicate)
    返回符合匹配条件的元素的个数
val mList = arrayListOf(0, 1, 2, 3, 4)
println(mList.count { it % 2 == 0 })
3
  • max, min
    查询最大,最小元素,空集返回null
val mList = arrayListOf(0, 1, 2, 3)
println(mList.max())
println(mList.min())
3 
0
  • take
    截取前n个元素为子集合
val mList = arrayListOf(0, 1, 2, 3)
val mNewList = mList.take(2)
println(mNewList)
[0, 1]
  • map(transform)
    将集合中的元素通过转换函数transform映射后的结果,存到一个集合中返回
val mList = mutableListOf(1, 3, 2, 4)
println(mList.map { it + 1 })
[2, 4, 3, 5]
  • mapNotNull(transform)
    遍历集合每个元素,得到通过函数算子transform映射之后的值,剔除掉这些值中的null,返回一个无null元素的集合
val mList = mutableListOf(1, null, 3, null, 2, 4)
println(mList.mapNotNull { it })
[1, 3, 2, 4]
  • reversed
    倒序排列
val mList = listOf(1, 3, 2, 4)
println(mList.reversed())
[4, 2, 3, 1]
  • sorted() / sortedDescending
    升序排序和降序排序。
val mList = listOf(1, 3, 2, 4)
println(mList.sorted())
println(mList.sortedDescending())
[1, 2, 3, 4] 
[4, 3, 2, 1]
  • sortedBy / sortedByDescending
    可变集合MutableList的排序操作。根据函数映射的结果进行升序排序和降序排序。
val mList = mutableListOf(1, 3, 2, 4)
println(mList.sorted())
println(mList.sortedDescending())
[1, 2, 3, 4] 
[4, 3, 2, 1]
  • zip
    合并元素
val mList3 = arrayListOf("x1", "x2", "x3", "x4")
val mList4 = arrayListOf("y1", "y2", "y3")
println(mList3.zip(mList4))
[(x1, y1), (x2, y2), (x3, y3)]
  • plus
    合并两个List
val mList1 = arrayListOf(0, 1, 2, 3)
val mList2 = arrayListOf(4, 5, 6, 7, 8)
println(mList1.plus(mList2))
[0, 1, 2, 3, 4, 5, 6, 7, 8]

参考文章:

loop@ for(i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}

相关文章

网友评论

    本文标题:kotlin - 基础

    本文链接:https://www.haomeiwen.com/subject/bvehyqtx.html