Kotlin教程之函数和包的定义和流程控制

Kotlin教程之函数和包的定义和流程控制

包名的定义

在xxx.kt文件的顶部进行定义,使用package关键字,定义后,引用包内函数或类,使用包前缀:

package cn.jasonmarzw //包定义
fun doSomething(){} // 定义的函数
class User(){} //定义的类
在其他文件中使用时:
可以直接使用 cn.jasonmarzw.doSomething()和 cn.jasonmarzw.User进行调用。可以像Java一样,使用import引入所需要的包。
也可以不定义包名,这样就是默认包,default,不需要报名修饰符就可以访问。
这样在项目文件组织结构上,可以考虑按不一样的结构进行分类。

使用

使用import关键字导入所需要的类和函数:
import cn.jasonmarzw.User 导入User类
import cn.jasonmarzw.doSomething 导入doSomething函数

可以使用as关键词添加别名:

import cn.jasonmarzw.User as Person //添加User别名为Person
import cn.jasonmarzw.doSomething as justDo //添加doSomething 函数别名为justDo
var p = Person() //初始化User类对象
justDo() //实际调用doSomething函数

二、流程控制(Control Flow)

If判断

功能包括以下几类:

  • 常规逻辑判断: if(a>b) print(a) else print(b)
  • 返回值:

if允许有返回值,返回值在最后的表达式,因此可以用作替代三元运算符?:

var valid = a>b?true:false
var valid = if(a>b) true else false //上述表达式的替代写法
println(valid) //输出结果为true

若if后是多个表达式,则返回值是最后一个表达式:

var valid=if(a>b){
  println(a)
  a
}else{
  println(b)
  b
}

valid的值是a或者b,若去掉a和b,观察下valid的值:

var valid=if(a>b) println(a) else println(b)
println(valid)

输出结果为:

kotlin.Unit

kotlin.Unit为无类型,类似java中的void,可见无返回。

使用for循环

fun forLoop(array: Array<String>) {
  for (str in array) {
    println(str)
  }
}

or

fun forIndices(array: Array<String>) {
  for (i in array.indices) {
    println(array[i])
  }
}

使用while循环

fun whileLoop(array: Array<String>) {
  var i = 0
  while (i < array.size) {
    println(array[i++])
  }
}

主要包括三种类型:

  • Break
  • continue
  • return

1.break和continue

用法与java一致,用在循环中(for,while),还添加了一层特殊的用法,使用标识符@定义label,一般用在内层循环中跳到外层循环:

loop@ for(i in 0..2){
  for(j in 0..3){
    if(j==2)
      continue@loop//跳到外层循环,继续往下执行
  }
}

将continue换成break,j值为2的时候,跳到label定义处,跳出该层循环:

loop@ for(i in 0..2){
  for(j in 0..3){
    if(j==2)
      break@loop//跳到外层循环label处,跳出改层循环
  }
}

2.return

在函数中使用return,当函数没有返回值时,可以使用return或者return@label退出函数;当函数有返回值时,不可以使用label返回。

fun foo(){
  var intArray = arrayOf(1,2,3)
  intArray.forEach{
    if(it==2)return //遍历到第二个元素时退出函数
    println(it)
  }
  println("end")
}

当使用label时,表示退出当前循环:

fun foo(){
  var intArray = arrayOf(1,2,3)
  intArray.forEach{
    if(it==2)return@forEach //遍历到第二个元素时退出函数
    println(it)
  }
  println("end")
}

When表达式

when类型switch表达式,拥有多个分支,但是区别于switch,其具有的

常规逻辑判断:

when(x){ 1 -> print(“is one”) else -> print(“not one”)}

判断x的表达式部分,可以是具体的值,可以是表达式,可以是取值范围判断。

表达式:

用作表达式时,有返回值 :

var a = 1
 var x = when (a) {
     3 -> {
     print(a)
     3 //返回值
   }
     else -> {
       print("unit")
       2 //返回值
     }
   }

查看When表达式定义:

"when" ("(" expression ")")? "{"whenEntry*"}"

when条件部分定义为:(“(” expression “)”)?,是一个表达式,可忽略

whenEntry部分定义: whenCondition{“,”} “->” expression SEMI “else” “->” expression SEMI,whenCondition部分允许使用逗号分隔,支持多个condition组合,如:is String,is Boolean -> println(“cool”),->符号表示后面是内容部分,由表达式expression和SEMI组成,后面的else,当when当做表达式时,必须要有,否则返回值为Unit类型。

whenCondition定义::expression: (“in” | “!in”) expression : (“is” | “!is”) isRHS,可以直接是表达式,或者是in、!in修饰的表达式,或者 is、!is修饰的表达式。

使用集合

遍历一个集合:

for (name in names)
println(name)

使用in操作符检查一个集合是否包含一个对象:

if (text in names) // 调用names.contains(text)
print(“Yes”)

使用Lambda表达式过滤和映射集合:

names
.filter { it.startsWith(“A”) }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }

创建DTO(POJO/POCO)

data class Customer(val name: String, val email: String)

提供带有下列功能的Customer类:
-所有属性的getter(和var的setter)
-equals()
-hashCode()
-toString()
-copy()
-component1(),component2()

try/catch表达式

fun test() {
   val result = try {
    count()
   } catch (e: ArithmeticException) {
   throw IllegalStateException(e)
  }
  // 和result一起工作
}

本篇基本上对一些的基本语法进行了解释,不多说慢慢学习吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Kotlin基础教程之函数定义与变量声明

    Kotlin基础教程之函数定义与变量声明 可以看到,函数定义就是 <访问控制符> <函数名> <参数列表> <:返回类型(不写就是无返回类型)> { 函数体 } 单语句函数可以简写,比如add函数和add1函数效果是一样的 变量定义 var <标识符> : <类型> = <初始化值> 常量定义 val <标识符> : <类型> = <初始化值> 常量与变量都可以没有初始化值,但是在引用前

  • kotlin基础教程之类和继承

    kotlin基础教程之类和继承 类声明 使用class关键字声明类,查看其声明格式: : modifiers ("class" | "interface") SimpleName typeParameters? primaryConstructor? (":" annotations delegationSpecifier{","})? typeConstraints (classBody? | enumClassBody)

  • Kotlin基础教程之数据类型

    Kotlin基础教程之数据类型 一切都是对象. 在Kotlin中一切都是对象.Kotlin有一些基本类型Boolean,Byte,Shot,Int,Long,Float,Double 在Kotlin中没有原始类型,以上这些类型都是对象,比如 运行结果如下 Kotlin支持16进制字面值,二进制字面值和科学记数法,官方文档中没有提到8进制 所有基本的几个数据类型不会进行显式类型转换,这一点尤为重要!那么如何进行转换呢?如下: 可以使用toLong,toInt,toShort,toChar等函数进行

  • Kotlin基础教程之控制流(顺序,分支,循环)

    Kotlin的控制流与其他语言一样,顺序,分支,循环 顺序语句就不多说,分支有两种,if-else和when(类似于Java中的switch) if语句: 运行结果: Java中的case语句不仅支持整数值,最新的JVM还支持字符串,Kotlin的when语句更是强大,开关变量甚至可以是Double,Array等各种类型,换句话说when语句比switch语句强大,与if-else语句的能力已经不相上下: 运行结果: while和do-while语句 与Java没有太大区别 运行结果: for循

  • Kotlin基础教程之面向对象

    Kotlin 面向对象 这几天一直在准备考试,实在没有时间,已经过去了这么久,终于要到面向对象了! 先看看Kotlin中的类长什么样吧. 可以看到Kotlin中的类还是很普通的,大多与Java相似,比较特殊的有: 每一个构造函数都必须为每一个成员变量赋予初值. primary constructor,这个构造函数的头部紧跟在类名之后,函数体却在类中,是由init关键字包含的一个代码块,这种函数头和函数体分开的写法还是很少有的,其实这两个部分会被整合成一个构造函数,使用jd-gui反编译class

  • Kotlin基础教程之操作符与操作符重载

    Kotlin基础教程之操作符与操作符重载 Kotlin操作符的使用方法与其他语言差不多,最大的特点就在于infix function call(事实上infix function call并不是操作符的特性,而是函数的特性)和操作符重载. 可以看到在Kotlin中大部分的操作符都与一个函数相对应,之所以这样做,大概是为了进行操作符重载. Kotlin官方文档中强调"=赋值"操作在Kotlin中不是操作符,换句话说类似于x = y = z这样的连续赋值并不被允许(甚至赋值操作也不能和常规

  • Kotlin基础教程之Run,标签Label,函数Function-Type

    Kotlin基础教程之Run,标签Label,函数Function-Type 在Java中可以使用{}建立一个匿名的代码块,代码块会被正常的执行,除了改变了作用域之外,似乎并没有什么其他的作用.然而在Kotlin中却不能这么做,这是为什么呢? 其实,我们都知道一个函数一定与一个内存地址相关,而一个匿名的代码块其实也相当于是一个匿名的函数.在Kotlin中一般使用run函数来运行一段匿名代码块. 如下: 在Kotlin中使用标识符后跟@符号来定义一个标签,使用@后跟标识符来引用一个标签,run函数

  • Kotlin教程之基本数据类型

    Kotlin教程之基本数据类型的学习 基本类型 我们知道java的基本类型分为基本数据类型: int 普通整型 float 浮点型 char 字符型 short 短整型 byte 字节型 long 长整型 double 双精度 boolean 布尔型 和引用数据类型: class Type 类类型 interface Type 接口类型 array Type 数组类型 null Type 空类型 在 Kotlin 中,所有变量的成员方法和属性都是一个对象.一些类型是内建的,因为它们的实现是优化过

  • Kotlin教程之函数和包的定义和流程控制

    Kotlin教程之函数和包的定义和流程控制 包名的定义 在xxx.kt文件的顶部进行定义,使用package关键字,定义后,引用包内函数或类,使用包前缀: package cn.jasonmarzw //包定义 fun doSomething(){} // 定义的函数 class User(){} //定义的类 在其他文件中使用时: 可以直接使用 cn.jasonmarzw.doSomething()和 cn.jasonmarzw.User进行调用.可以像Java一样,使用import引入所需要

  • Kotlin学习教程之函数的默认参数

    前言 ​ 在Java中,为函数的参数添加默认值是不被允许的,这是为了防止默认参数与函数重载同时使用时二义性的问题,考虑下面的例子: void func(p1: String, p2: String, p3: String = "default") { // do something } void func(String p1, String p2) { // do something } 假设上面的代码是可以编译通过的,那么当调用func("p1","p2

  • JavaScript进阶教程之函数的定义、调用及this指向问题详解

    目录 前言 一:函数的定义 1.1 命名函数 1.2 匿名函数 1.3 利用 new Function() 声明函数 1.4 重要结论 二:函数的调用 2.1 普通函数调用 2.2 立即执行函数调用 2.3 对象内方法调用 2.4 构造函数调用 2.5 事件函数的调用 2.6 定时器函数的调用 三:各类函数的内部this指向问题 总结 前言 这篇文章开始我们函数的进阶篇,和我们JavaScript基础学的函数有了很多拓展,这篇文章首先我们从函数的定义,调用,及其 this指向 来一个总结. 一:

  • Go语言七篇入门教程五文件及包

    目录 1. 文件处理 1.1 JSON文件 1.1.1 已知JSON结构 1.1.2 未知JSON结构 1.1.3 Encoder & Decoder 1.2 XML文件 1.3 二进制文件 1.4 zip文件 1.4.1 创建zip 1.4.2 读取zip文件 2. 包管理 2.1 包路径 2.2 包声明 如何学习Go 1. 文件处理 1.1 JSON文件 什么是json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 也是在web开发中的前后

  • Kotlin挂起函数原理示例剖析

    目录 一.序言 二.CPS原理 CPS参数变化 CPS返回值变化 三.挂起函数的反编译 四.伪挂起函数 五.多个挂起函数前后关联 六.在Java中调用suspend函数 七.总结 一.序言 Kotlin挂起函数平时在学习和工作中用的比较多,掌握其原理还是很有必要的.本文将一步一步带着大家分析其原理实现. ps: 文中所用的Kotlin版本是1.7.0. 二.CPS原理 在某个Kotlin函数的前面加个suspend函数,它就成了挂起函数(虽然内部不一定会挂起,内部不挂起的称为伪挂起函数). 先随

  • python进阶教程之函数对象(函数也是对象)

    秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开之前,我们先提一下lambda函数.可以利用lambda函数的语法,定义函数.lambda例子如下: 复制代码 代码如下: func = lambda x,y: x + y print func(3,4) lambda生成一个函数对象.该函数参数为x,y,返回值为x+y.函数对象赋给func.fun

  • 详解Kotlin 高阶函数 与 Lambda 表达式

    详解Kotlin 高阶函数 与 Lambda 表达式 高阶函数(higher-order function)是一种特殊的函数, 它接受函数作为参数, 或者返回一个函数. 这种函数的一个很好的例子就是 lock() 函数, 它的参数是一个锁对象(lock object), 以及另一个函数, 它首先获取锁, 运行对象函数, 然后再释放锁: fun <T> lock(lock: Lock, body: () -> T): T { lock.lock() try { return body()

  • C语言进阶教程之函数指针详解

    目录 一.函数指针 1.概念 1.2函数指针的使用方法 1.3练习巩固 1.4小结一下 二.阅读两段有趣的代码 1.( *(void( *)( ))0 )( ) 2.void (* signal(int,void( * )( int ) ) )(int) 附:函数指针的应用——函数回调 总结 一.函数指针 1.概念 函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址: 请看示例: int main(){ int a = 10; int*pa = &a; char ch

随机推荐