Kotlin学习(三)—— 基本类型,包,控制流:if、when、for、while,Break和continue

一.基本类型

Kotlin的数字表现,如下

  • Double 64
  • Float 32
  • Long 64
  • Int 32
  • Short 16
  • Byte 8

这些就是全部的定义数字的方式了,而我们一般的写法也和JAVA类似

  • 十进制: 10086
  • 十六进制:0x0F
  • 二进制: 0b00001011
  • Long类型:10086L
  • Float类型:10086f
  • Double类型:100.86

同时,Kotlin上有一个下划线的定义,可以让代码的可读性更加的强,我们来看下

fun main(args: Array<String>) {
    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

    print("$oneMillion \n")
    print("$creditCardNumber \n")
    print("$socialSecurityNumber \n")
    print("$hexBytes \n")
    print("$bytes \n")
}

这段代码输出的数字

下划线并不像JAVA一样会影响我们的代码,而是让我们的代码可读性变得更强

并且在JAVA平台中,== 和 === 的概念 就跟我们JAVA中 == 和eques类似

    val a: Int = 10000
    // true
    print(a === a)
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    // false
    print(boxedA === anotherBoxedA)

这段代码中,我们可以看到,我们定义了一个Inta,又定义了两个可空Int 赋值 a,结果算出===false,但是如果我们
改成== ,那就是值相等了,===是地址相同,很明显,我们是两个不同的变量,所以false

另外,在Kotlin中,小类型也不是大类型的子类,所以不存在强转的概念

比如这种错误的示范

    val b: Byte = 1
    val i: Int = b

这就隐式转换,但是我们可以用个显示转换来达到我们的需求

    val b: Byte = 1
    val i: Int = b.toInt()
    print(i)

每个数字都是可以通过显示转换来达到自己想要的转换

我们再来看下逻辑运算

  • shl(bits) ‒ 有符号左移 (Java 的 << )
  • shr(bits) ‒ 有符号右移 (Java 的 >> )
  • ushr(bits) ‒ 有符号右移 (Java 的 >>> )
  • and(bits) ‒ 位与
  • or(bits) ‒ 位或
  • xor(bits) ‒ 位异或
  • inv() ‒ 位非

我们来写一段演示的示例


    val a: Int = 3
    //<< 1
    print("${a shl 1} \n")
    //>> 1
    print("${a shr 1} \n")
    //>>> 1
    print("${a ushr 1} \n")
    //and 1
    print("and: ${a.and(5)} \n")
    //or  7
    print("or : ${a.or(5)} \n")
    //xor 6
    print("xor : ${a.xor(5)} \n")
    //inv -4
    print("inv : ${a.inv()} \n")

再来看下Char,Char不能作为一个单独的字符或数字存在,需要‘’单引号声明,比如

    var a : Char = '1'

我们再来看下如何定义一个数组

    //定义items["1","2","3"]
    val items = listOf<String>("1","2","3")
    //指定大小,内容为空
    val itemNulls = arrayOfNulls<Int>(10)
    // 创建⼀个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
    //val asc = Array(5, { i -> (i * i).toString() })
    // 定义五个数 一直递增
    val asc = Array(5, {i -> (i * i)})

listOf直接声明,arrayOfNulls声明一个长度固定的空数组Array定义一个指定长度,值的数组

再来看下字符串

    for (c in "Hello") {
        println("$c")
    }

这是我们常见的字符串,可以包含转义,还有一种

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

这是原生的字符串,用三个”“”表示,里面不包含转义,是什么就是什么,当然,这样的话里面就有很多空格了

    val text = """
        |for (c in "foo")
            |print(c)
        """.trimMargin()
    print(text)

我们可以|声明当前起始位,并且trimMargin()去除空格,得到的结果

如果你没有这样处理的话,你输出的值是这个样子的

二.包

包的作用我相信大家都是知道的


package com.liuguilin.kt_package

fun main(args: Array<String>) {

    print(sum(1,3))
}

fun sum(a: Int, b: Int): Int {
    return a + b;
}

三.控制流:if、when、for、while

1.if表达式

在kotlin中,if的用法不局限于判断,他还会有返回,所以我们的写法也很多,比如

    val a = 12;

    //传统
    if (a > 10) {
        print(">")
    } else {
        print("<")
    }

    //表达式
    if (a > 10) print(">") else print("<")

    //表达式
    var b = if (a > 10) 10 else 20

2.When表达式

    val today = 4;
    when (today) {
        1 -> print("春季")
        2 -> print("春季")
        3 -> print("春季")
        4 -> print("夏季")
        5 -> print("夏季")
        6 -> print("夏季")
        7 -> print("秋季")
        8 -> print("秋季")
        9 -> print("秋季")
        10 -> print("冬季")
        11 -> print("冬季")
        12 -> print("冬季")
    }

但是我们一般是需要else结尾的,而且我们可以用in来表达

    val today = 4;
    when (today) {
        in 1..3 -> print("春季")
        in 4..6 -> print("夏季")
        in 7..9 -> print("秋季")
        in 10..12 -> print("冬季")
        else -> print("error")
    }

当然,你还可以用is来判断类型,这里就不讲了

3.For 循环

    var items = listOf(1,2,3);

    //out 123
    for(a in items) print(a)

    //out 012
    for (a in items.indices) print(a)

    //out 0 , 1  1 , 2  2 , 3
    for ((a,b)in items.withIndex()) print("$a , $b \n")

4.While 循环

    var a = 5;

    while (a > 3){
        print(a)
        a--;
    }

    do {
        print(a)
        a--;
    }while (a > 3)

四.Break和continue

Kotlin 有三种结构化跳转表达式:

  • return。默认从最直接包围它的函数或者匿名函数返回。
  • break。终止最直接包围它的循环。
  • continue。继续下一次最直接包围它的循环。

我们来看一个例子

    var items = listOf(1, 3, 5, 7, 9)

    for (a in items) {
        if (a == 5) {
            continue | break | return
        }
        print("$a \n")
    }

这里循环一个数组,如果等于5就分别执行continue,break,return,如果是break,return会跳出循环,也就
只会打印1,3而continue会跳出本次循环,也就会打印1,3,7,9

如果有兴趣的话,可以来Github参与一下

我的公众号,期待你的关注

时间: 2024-10-01 10:20:03

Kotlin学习(三)—— 基本类型,包,控制流:if、when、for、while,Break和continue的相关文章

实例学习SSIS(三)--使用包配置

原文:实例学习SSIS(三)--使用包配置 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)--使用日志记录和错误流重定向 实例学习SSIS(五)--理论介绍SSIS 包配置是干嘛滴!          使用包配置可以从开发环境的外部设置运行时属性和变量. 目标:          从开发环境外部指定Foreach要遍历的文件夹,然后把该文件夹下相应的txt文件内容写入库中. 步骤:    

Mysql 5.7 Gtid内部学习(三) Gtid和Last_commt/sequnce_number的生成时机

一.Gtid生成类型 这里首先使用源码的解释给出三种类型: AUTOMATIC_GROUP GTID_GROUP ANONYMOUS_GROUP 其中AUTOMATIC_GROUP通常用于主库开启Gtid的情况,GTID_GROUP通常用于备库和使用了GTID_NEXT的情况下. 源码中有详细解释如下: /** Specifies that the GTID has not been generated yet; it will be generated on commit. It will d

sqlserver 2000-eclipse导入连接数据库需要的三个jar包后,还是连不上数据库

问题描述 eclipse导入连接数据库需要的三个jar包后,还是连不上数据库 代码如下:mport java.sql.*;import java.util.Vector;import javax.swing.*;public class Test1 extends JFrame{ JTable jt=null;JScrollPane jsp=null;Vector rowData=null;Vector columnName=null;Connection cn=null;PreparedSta

C/C++程序开发中实现信息隐藏的三种类型_C 语言

无论是模块化设计,还是面向对象设计,还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求.以本人浅显的经验,把信息隐藏按照程度的不同分成(1)不可见不可用(2)可见不可用(3)可见可用. 1 不可见不可用 就是说模块内部的变量.结构体.类定义对外部而已完全隐藏,外部对此一无所知.常用的实现方法就是利用不透明指针,请参见我的博文C语言开发函数库时利用不透明指针对外隐藏结构体细节. 这种方法同样适用于C++语言,一种可能的实现方式为面向接口编程. 头文件 IMyClass.h class

三种类型的DNS攻击以及应对方法

本文讲的是 :   三种类型的DNS攻击以及应对方法 ,   [IT168 方案] DNS服务器能够将IP地址翻译成域名,这就是为什么你可以在浏览器输入cnw.com.cn来访问我们的网站,而不需要记住IP地址. 当DNS被攻击时,可能发生各种情况,不过,攻击者经常使用两种方法来利用被攻击的DNS服务器.首先,攻击者可以做的第一件事情是重定向所有入站流量到他们选择的服务器.这使他们能够发动更多的攻击,或者收集包含敏感信息的流量日志. 攻击者可以做的第二件事情是捕捉所有入站电子邮件.更重要的是,第

rtmp解析中3类型包的问题

问题描述 rtmp解析中3类型包的问题 最近在做rtmp的解析,但是解析过程中遇到了一个问题: 如图,上部分红色部分为一个rtmp包,长度为0x0141,跳转之后到达D4,根据rtmp文件,4类型(1字节)的rtmp包的长度与上一个rtmp包的长度相同(不是分割),因此这个rtmp包的长度也应为0x0141,但是在这个包结束之前已有下一个包开始(红色部分),请问高手这部分该如何解析? 注:chuncksize = 0x40000, 从D4包跳转后的数据在下图绿色部分

java定义数组的三种类型总结_java

三种定义数组的格式如下: int[] arr1=new int[10]; int[] arr2={1,2,3,6}; int[] arr3=new int[]{1,2,3,4,5,6,7,22}; 注意:数组的length是一个属性,而字符串的length()是一个方法了!!!虽然都是求的他们各自的长度 package 第四天; public class 数组 { public void showArray(int[] arr) { for(int i=0;i<arr.length;i++) S

《帝国时代Online》将免费运营推三种扩展包

目前正在内测阶段的<帝国时代Online>公开了未来的运营模式,据微软称,该游戏将采用免费模式运营,会对免费玩家做部分限制,并会出售三种扩展包供玩家消费. <帝国时代Online>是微软<帝国时代>系列的最新作品,游戏由机器人工作室开发,于2010年德国科隆电玩展上首次公开.<帝国时代Online>仍然是一款集资源采集.社会建设和军事扩张为一体的经营策略类游戏,游戏拥有完整的故事线,玩家可以在网络上寻找战友合作完成任务.进行贸易.探索世界和发动战争. <

[20120509]IOT索引组织表相关信息的学习(三).txt

[20120509]IOT索引组织表相关信息的学习(三).txt 上次链接:http://space.itpub.net/267265/viewspace-719517http://space.itpub.net/267265/viewspace-717272 IOT 是一种特殊的索引结构,使用它能够解决特定场合的应用问题,但是在许多应用中很少使用,更多的是使用堆表.我仅仅在生产系统中对3个表使用,我偏向使用静态以及"只读"的小表. 如果IOT表存在除主键外的第2索引,如果使用它存在物