Kotlin语法 入门篇章(1)

摘要:
for{println}..是创建两端闭区间的关键字。在main方法中写上面那段代码,运行后会打印1-10。for{println}上述代码表示在[0,10]的时候,每次执行循环都会在区间范围内递增2。此外我们还可以使用downTo创建一个降序的区间for{println}插入上方代码重新运行就会打印10-1;面向对象1.类与对象创建一个类,选择classclassPerson{varname=""varage=0funeat(){println}}创建name和age两个字段。不能使用val,使用val之后不能重新赋值,相当于Java中的final关键字。
Java和Kotlin数据类型对比表
Java基本数据类型Kotlin对象数据类型数据类型说明
intInt整形
longLong长整型
shortShort短整形
floaFloat单精度浮点型
doubleDouble双精度浮点型
booleanBoolean布尔型
charChar字符型
byteByte字节型

点击右侧绿色按钮运行

Kotlin语法 入门篇章(1)第1张

函数:

定义一个方法,接收两个整形参数,返回一个最大值

fun main(){
    print(methodName(2,9))
}

//函数

//返回两个数其中一个比较大的值
fun methodName(parame1: Int,parame2:Int):Int{
    returnmax(parame1,parame2)
}

当函数只有一行代码的时候,我们还能简写,像这样,我们可以将上面的写法简写成这样,输出结果是一样的

fun methodName(parame1:Int,parame2:Int)= max(parame1,parame2)

2.判断语句

fun largeNumber(num1:Int,num2:Int):Int{
    var v=0;
    if (num1>num2){
        v=num1
    }else{
        v=num2
    }
    returnv
}

这里的写法实现的效果其实和上面的差不多,都是返回一个最大值

kotlin的if语句比相较于Java多了一个功能,那就是可以有返回值,是不是感觉很神奇呢,小编也觉得很神奇,那究竟是怎么一回事呢,快跟着小编来看看吧,事实就是kotlin的if可以携带返回值,而Java的不可以,看到这里你是不是和小编一样感到很神奇呢。小编第一次知道也是感觉感到很神奇,快给小编点个赞吧。

Kotlin语法 入门篇章(1)第2张

好了,不沙雕了。

将上面的代码改写为

fun largeNumber(num1: Int, num2: Int): Int {
    val v = if (num1 >num2) {
        num1
    }else{
        num2
    }
    returnv
}

注意,这里每个条件最后一行代码作为返回值,最终将变量v返回,直接在main()方法里打印就可以看到结果

Kotlin语法 入门篇章(1)第3张

when语句

我们现在做一个查询商品价钱的功能

fun getShopPrice(name:String)=if (name=="香蕉"){
    3}else if (name=="苹果"){
    5}else if (name=="菠萝"){
    10}else{
    0}

这里定义一个方法,接收一个String类型参数,并返回一个价钱

这里的代码其实还是有些冗余,虽然可以实现很多功能,但是如果判断条件多的时候就应该考虑考虑使用when了

fun getShopPrice(name:String)=when(name){
    "香蕉" ->5
    "苹果"->6
    "菠萝"->9
    else ->0}

有没有感觉不仅代码更好看了,而且更好看了

当代码逻辑只有一行的时候 花括号可省略

在when中可以进行类型匹配

fun checkNumber(num:Number){
    when(num){
        is Int -> println("这是一个整形")
        is Double -> println("这是一个双精度浮点型")
        else -> println("不是 num类型")
    }
}

什么是类型匹配??

在kotlin中,Number相当于一个抽象类,Int Long Float Double都是它的子类型,所以这里可以使用类型匹配来判断传入的是什么参数

循环语句

熟悉Java的都知道,java有两种循环方式 while和for循环,kotlin也提供这种循环,kotlin对for循环进行了一些修改,for-i在kotlin中被舍弃。

    for (i in 0..10){
        println(i)
    }

.. 是创建两端闭区间的关键字。在 .. 指定区间的左右端点就可以创建一个区间了。

在main方法中写上面那段代码,运行后会打印1-10。

不过,很多时候双端闭区间不如单端闭区间好用。因为数组的下标都是从0开始,一个长度为10的数组,它的下标范围是0-9.因此左闭右开的区间在程序中更常用,kotlin可以使用until来创建一个左闭右开的区间。

    for (i in 0 until 10 step 2){
        println(i)
    }

上述代码表示在[0,10]的时候,每次执行循环都会在区间范围内递增2。打印的结果都是偶数。

此外我们还可以使用 downTo创建一个降序的区间

    for (i in 10 downTo 1){
        println(i)
    }

插入上方代码重新运行就会打印10-1;

面向对象

1.类与对象

创建一个类,选择class

Kotlin语法 入门篇章(1)第4张

classPerson {
    var name=""
    var age=0
    fun eat(){
        println("这个人叫"+name+"他今年"+age+"岁了")
    }
}

创建name 和age两个字段。不能使用val,使用val之后不能重新赋值,相当于Java中的 final关键字。

实例化这个类

val p=Person()
p.name="小明"
p.age=21
p.eat()

2.继承

Kotlin语法 入门篇章(1)第5张

在Person类的class前面加上open关键字,使其成为可继承

然后新建Student并插入如下代码

classStudent : Person() {
    var sno=""var grade=0}

这里的继承和java的关键字不同,使用一个冒号即可

kotlin将构造函数分成了两种主构造函数和次构造函数

主构造函数的特点是没有函数体,直接定义在类名后面即可。比如:

class Student(val sno:String,val grade :Int) : Person() {
}

这样写,在实例化Student对象的时候就必须要传入参数

  val s=Student("张益达",25)

init是kotlin提供的一个结构体,可以实现类似主构造函数类似的一些逻辑。

init {
        println("学号是:"+sno)
    }

接口

新建一个一个类 New->Kotlin File/Class,输入文件名 Study,创建类型选 Interface

接口类型不需要有函数体

代码:

interfaceStudy {
    fun readBooks()
    fun doHomework()
}

首先把Person类的代码改写为

open classPerson(val name:String,val age:Int) {

}

接下来到Student中实现这个接口

classStudent(name: String,age:Int) : Person(name,age),Study{

}
classStudent(name: String,age:Int) : Person(name,age),Study{
    override fun readBooks() {
        println(name+"看书")
    }

    override fun doHomework() {
        println(name+"做家庭作业")
    }

}

现在到main中调用这两个函数

fun main() {
    val studnt=Student("Jack",19)
    doStudy(studnt)

}
fun doStudy(study: Study){
    study.readBooks()
    study.doHomework()
}

Kotlin语法 入门篇章(1)第6张

Java和kotlin函数可见性修饰符对照表
修饰符Javalotlin
public所有类可见所有类可见 默认
private当前类可见当前类可见
protected当前类 子类 同一包路径下可见当前类 子类可见
default同一包路径下的类可见 默认

internal 无 同一模块中的类可见

数据类与单例类

新建一个kotlin类 命名为 Cellphone

代码

data classCellphone(val brand:String,val price:Double){
}

在main写入如下代码

fun main() {
    
    val cell1=Cellphone("一加",2999.00)
    val  cell2=Cellphone("小米",1999.00)

    println(cell1)
    println(cell1==cell2)
}

运行后输出如下

Kotlin语法 入门篇章(1)第7张

一定很好奇这些输出的内容是哪里来的吧,这主要归功于data关键字。在kotlin中只要声明了这个关键字,就表示了这是一个数据类,kotlin会根据主构造函数中的参数自动生成 equals(),hashCode() toString(),等固定且无实际逻辑意义的方法,减少很多开发的工作量。

单例类

新建一个 kotlin类,输入Singleton,选择创建类型 Object

输入代码如下:

object Singleton {
    fun singletonTest(){
        println("调用单例测试")
    }
}

在main方法中调用

Singleton.singletonTest()

在kotlin中我们班不需要私有化构造函数,也不需要提供getInstance()这样的静态方法。只需要将class关键字换成object,一个单例类创建完成了。

Lambda编程

lambda0.1 List集合的创建和遍历
创建一个list集合通常最基础的写法如下。
    val list=ArrayList<String>()
    list.add("1")
    list.add("1")
    list.add("1")
    list.add("1")
    list.add("1")
    list.add("1")
这种写法比较繁琐,为此kotlin提供了一个内置的listof()的函数来初始化集合的写法,如下:
    val list= listOf("1","2","3","4")

遍历

   for(i in list){
        println(i)
    }

不过需要注意,listOf是不可变得集合。该集合只能用于读取,无法进行添加和修改删除操作。如果需要创建一个可变的集合只需要把listOf替换为mutableListOf即可

    val list= mutableListOf("1","2","3","4")

遍历方式和上面的一样

lambda0.2 Set集合的创建和遍历
set和list的用法基本一致,只是将创建集合的方式换成了 mutableSetOf和setOf,而set和list最大的区别就是 Set集合底层是使
映射机制来存放数据,因此无法保证元素有序。
    val set= setOf("1","2","3")
    for(s in set){
        println(s)
    }

最后来看看Map,map是使用 key value的方式存储数据,和list set的用法有较大不同。看代码

 val map=HashMap<String,Int>()
    map.put("a",5)
    map.put("a1",6)
    map.put("a2",7)
    map.put("a3",8)

这种写法与java很相似。但其实kotlin中不建议使用 put 和 get对map数据集进行添加和读取操作。而是推荐使用另一种类似于数组下标的语法结构。比如向map集合加一条数据可以这么写:

 val map=HashMap<String,Int>()
    map["a"]=1

读取可以这么写

val nmeber=map["a"]

当然这不是最简便的写法,我们还可以这么写

 val map= mapOf("a1" to 1,"v" to 2, "b" to 3, "c" to 4)

这里看似使用 to这个关键字进行关联的,但其实to并非关键字。而是一个 infix的函数。

最后看下如何遍历map集合

    for((k,v)in map){
        println("键是 "+k+" 值是 "+v)
    }
集合的函数式API
假定有如下需求 查找一个list中名字最长的水果,常规写法可以这么写。
    val list = listOf("苹果","西红柿","红心龙果")
    var maxLengthFruit=""
    for(f in list){
        if (f.length>maxLengthFruit.length){
            maxLengthFruit=f
        }
    }
    println(maxLengthFruit)

不过如果使用了 集合函数的API这一切都会很简单。

将上面代码改为

    val list = listOf("苹果","西红柿","红心龙果")
    val maxLengthFilter=list.maxBy { it.length }
    println(maxLengthFilter)

上面的代码使用的就是函数式api,只用一行代码就可以实现查询集合中名字最长的水果的名字。

来看下Lambda的语法结构

{ 参数名1::参数类型,参数名2:参数类型 -> 函数体}

这是lambda表达式完整的语法结构定义。如果有参数传入到lambda表达式中国,我们需要声明参数列表。参数列表的结尾使用一个 ->符号,表示参数列表

的结束以及函数体的开始,函数体可以编写任意函数代码。

将list中的小写全部转大写

    val list = listOf("afaagadg","dfdfdafd","fdafdafdffdf")
    val newList=list.map { it.toUpperCase() }
    for(f in newList){
        println(f)
    }

其他的函数就自行查看文档吧,不想再写了。

免责声明:文章转载自《Kotlin语法 入门篇章(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决Ubuntu DNS解析慢、上网速度慢Virtualbox设置共享文件夹的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#生成pdf -- iText7 设置自定义字体和表格

itextsharp已经不再更新,由iText 7来替代 安装 nuget 安装 itext7 注册自定义字体 下载字体文件 .ttc或.ttf到项目目录,设置更新则拷贝到输出目录,这样构建的时候会把字体文件拷贝过去 windows系统自带黑体, 可以直接复制到项目目录, 其路径是 C:WindowsFontssimhei.ttf 因为字体注册只需要一...

7.模块化封装Storage实现缓存数据持久化

1.模块化封装Storage实现缓存数据持久化 1.在src目录下新建目录model,在model目录下新建js文件取名storage.js var storage={ set(key,value){ // 设置为本地缓存方法 localStorage.setItem(key,JSON.stringify(valu...

一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL

一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL 介绍   不知道大家在使用 ASP.NET MVC 时有没有一些扩展要求,反正我是有很多。在使用 MVC 这几年(PS:我是从 1.0 开始学,2.0、3.0 开发至今),我深深地觉得 MVC 的扩展性真是太好了,几乎你大部分的“合理”需求,用 MVC 都能实现。好了,废话不多...

delphi 对应 c# 的一些函数及类型的转换方法【原】

例一 实现目的:将字符串中每一个字符转成二进制(比如 'Data' 中的 D 转成 00100010 ,整个就是 00100010100001100010111010000110) 处理逻辑:string result = StrToByte("Data"); result结果是00100010100001100010111010000110   1、实际...

wpf mvvm模式下 在ViewModel关闭view

本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息   1 public UserView() 2 { 3 this.DataContext = new UserViewModel(); 4 InitializeComponent();...

C#学习笔记(22)——C#创建文本文件txt并追加写入数据

ref: https://www.cnblogs.com/Jacklovely/p/7263844.html 说明(2017-7-31 16:25:06): 1. 有两种办法,第一种是用FileStream创建txt,用StreamWriter写入数据,期间还要加上判断,是否存在这个txt文件,如果不存在就创建,存在就追加写入。太麻烦了! 2. 第二种是直...