kotlin 官方学习教程之基础语法详解

kotlin 官方学习教程之基础语法详解

Google 在今天的举行了 I/O 大会,大会主要主要展示内有容 Android O(Android 8.0)系统、Google Assistant 语音助手、Google 智能音箱、人工智能、机器学习、虚拟现实等。作为一个 Android 开发者,我关心的当然是 Android O(Android 8.0)系统了,那么关于 Android O 系统的一个重要消息是全面支持 Kotlin 编程语言,使得 Kotlin 成为了 Android 开发的官方语言,被称为 Android 开发中的 Swift 的它有什么优势,又到底会为 Android 开发者带来什么,还需要时间来观察。但是作为开发者的我们,已经可以明确的知道 Kotlin 是接下来 Android 开发的官方语言,所以,今天就为大家翻译一下 kotlin 官方文档。

基础语法

定义包名

包名应该在源文件的顶部定义:

package my.demo

import java.util.*

// ...

定义函数

带有两个 Int 型参数和 Int 返回类型的函数

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

fun main(args: Array<String>) {
  print("sum of 3 and 5 is ")
  println(sum(3, 5))
}

带有具体表达式并可以推测返回类型的函数

fun sum(a: Int, b: Int) = a + b

fun main(args: Array<String>) {
  println("sum of 19 and 23 is ${sum(19, 23)}")
}

返回无意义值的函数

fun printSum(a: Int, b: Int): Unit {
  println("sum of $a and $b is ${a + b}")
}

fun main(args: Array<String>) {
  printSum(-1, 8)
}

Unit 返回类型的函数返回类型可以省略

fun printSum(a: Int, b: Int) {
  println("sum of $a and $b is ${a + b}")
}

fun main(args: Array<String>) {
  printSum(-1, 8)
}

定义局部变量

赋值一次(只读)局部变量

fun main(args: Array<String>) {
  val a: Int = 1 // 定义变量时进行赋值
  val b = 2  // 自动推测变量类型为 Int
  val c: Int // 不提供初始化时需要定义变量类型
  c = 3    // 定义变量后再赋值

  println("a = $a, b = $b, c = $c")
}

可变的变量

fun main(args: Array<String>) {
  var x = 5 // 推断变量类型为 Int
  x += 1
  println("x = $x")
}

注释

像 Java 和 JavaScript 一样,Kotlin 支持行注释和块注释。
// 这是行注释

/* 这是
  块注释 */

和 java 不同的是,Kotlin 块注释可以嵌套。

使用字符串模板

fun main(args: Array<String>) {
  var a = 1
   // 使用变量名作为模板:
  val s1 = "a is $a" 

  a = 2
   // 使用任意表达式作为模板:
  val s2 = "${s1.replace("is", "was")}, but now is $a"
  println(s2)
}

使用条件表达式

fun maxOf(a: Int, b: Int): Int {
  if (a > b) {
    return a
  } else {
    return b
  }
}

fun main(args: Array<String>) {
  println("max of 0 and 42 is ${maxOf(0, 42)}")
}

以 if 作为表达式

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

fun main(args: Array<String>) {
  println("max of 0 and 42 is ${maxOf(0, 42)}")
}

使用可空变量以及空值检查

可能出现空值时,引用必须明确标记为可空的。

返回 NULL 如果 STR 不持有整数
fun parseInt(str: String): Int? {
  // ...
}

使用一个函数返回空值

fun parseInt(str: String): Int? {
  return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
  val x = parseInt(arg1)
  val y = parseInt(arg2)

  // 使" X×Y "产生错误的因为他们可能有空值。
  if (x != null && y != null) {
    // 经过空值检测后,X 和 Y 自动转换为非空值。
    println(x * y)
  }
  else {
    println("either '$arg1' or '$arg2' is not a number")
  }
}

fun main(args: Array<String>) {
  printProduct("6", "7")
  printProduct("a", "7")
  printProduct("a", "b")
}

又或者这个函数

fun parseInt(str: String): Int? {
  return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
  val x = parseInt(arg1)
  val y = parseInt(arg2)

  // ...
  if (x == null) {
    println("Wrong number format in arg1: '${arg1}'")
    return
  }
  if (y == null) {
    println("Wrong number format in arg2: '${arg2}'")
    return
  }

  // 经过空值检测后,X 和 Y 自动转换为非空值。
  println(x * y)
}

fun main(args: Array<String>) {
  printProduct("6", "7")
  printProduct("a", "7")
  printProduct("99", "b")
}

使用类型检查和自动转换

is 操作符检查表达式是否为某个类型实例。如果对不可变局部的变量或属性进行特定类型检查了,就不需要明确的类型转换:

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // obj 将会在这个分支被自动转换为 String 类型
    return obj.length
  }

  // obj 在种类检查外仍然是 Any 类型
  return null
}

fun main(args: Array<String>) {
  fun printLength(obj: Any) {
    println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
  }
  printLength("Incomprehensibilities")
  printLength(1000)
  printLength(listOf(Any()))
}

又或者这个函数

fun getStringLength(obj: Any): Int? {
  if (obj !is String) return null

  // obj 将会在这个分支被自动转换为 String 类型
  return obj.length
}

fun main(args: Array<String>) {
  fun printLength(obj: Any) {
    println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
  }
  printLength("Incomprehensibilities")
  printLength(1000)
  printLength(listOf(Any()))
}

又或者是这个函数

fun getStringLength(obj: Any): Int? {
  // // obj 将会在 && 右边被自动转换为 String 类型
  if (obj is String && obj.length > 0) {
    return obj.length
  }

  return null
}

fun main(args: Array<String>) {
  fun printLength(obj: Any) {
    println("'$obj' string length is ${getStringLength(obj) ?: "... err, is empty or not a string at all"} ")
  }
  printLength("Incomprehensibilities")
  printLength("")
  printLength(1000)
}

使用 for 循环

fun main(args: Array<String>) {
  val items = listOf("apple", "banana", "kiwi")
  for (item in items) {
    println(item)
  }
}

又或者这样写

fun main(args: Array<String>) {
  val items = listOf("apple", "banana", "kiwi")
  for (index in items.indices) {
    println("item at $index is ${items[index]}")
  }
}

使用 while 循环

fun main(args: Array<String>) {
  val items = listOf("apple", "banana", "kiwi")
  var index = 0
  while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
  }
}

使用 when 表达式

fun describe(obj: Any): String =
when (obj) {
  1     -> "One"
  "Hello"  -> "Greeting"
  is Long  -> "Long"
  !is String -> "Not a string"
  else    -> "Unknown"
}

fun main(args: Array<String>) {
  println(describe(1))
  println(describe("Hello"))
  println(describe(1000L))
  println(describe(2))
  println(describe("other"))
}

使用 ranges

检查 in 操作符检查数值是否在某个范围内:

fun main(args: Array<String>) {
  val x = 10
  val y = 9
  if (x in 1..y+1) {
    println("fits in range")
  }
}

检查一个数值是否超出范围

fun main(args: Array<String>) {
  val list = listOf("a", "b", "c")

  if (-1 !in 0..list.lastIndex) {
    println("-1 is out of range")
  }
  if (list.size !in list.indices) {
    println("list size is out of valid list indices range too")
  }
}

在范围内范围迭代:

for (x in 1..5) {
  print(x)
}

或者使用步进:

for (x in 1..10 step 2) {
  print(x)
}
for (x in 9 downTo 0 step 3) {
  print(x)
}

使用集合

对一个集合进行迭代:

for (item in items) {
  println(item)
}

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

when {
  "orange" in items -> println("juicy")
  "apple" in items -> println("apple is fine too")
}

使用 lambda 表达式筛选和映射集合

fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }

难以理解的小伙伴可以到 kotlin 官网运行一下代码,结合本文自行理解。

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

时间: 2017-05-17

Android Kotlin的使用及简单实例

Android Kotlin的使用及简单实例 写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望.为了趁热打铁,我决定提前三天放出原定本周日Release的文章.希望能及时让大家了解一下Kotlin. 相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系.因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享. 在写这篇文章前的一个多月,Flipboard中国的Andr

用Kotlin实现Android点击事件的方法

近期,Google宣布Kotlin成为了Android一级开发语言.于是就刚刚简单的研究了一下,查资料的时候发现现成的资料还是很少的,于是决定自己记录一下,方便以后查看,也供其他人一个参考. 在android中,点击事件大致分为三种写法: 1. 匿名内部类. 2. Activity实现全局OnClickListener接口. 3. 指定xml的onClick属性. 今天用Kotlin实现这三种方式实现点击事件 匿名内部类:这种方式最简单 override fun onCreate(savedIn

Kotlin开发的一些实用小技巧总结

前言 随着Google I/O大会的召开,Google宣布将支持Kotlin作为Android的开发语言,最近关于Kotlin的文章.介绍就异常的活跃. 本文主要给大家介绍了关于Kotlin开发的一些实用小技巧,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1.Lazy Loading(懒加载) 延迟加载有几个好处.延迟加载能让程序启动时间更快,因为加载被推迟到访问变量时. 这在使用 Kotlin 的 Android 应用程序而不是服务器应用程序中特别有用.对于 Androi

Kotlin 的注解类详解及实例

Kotlin 的注解类详解及实例 注解声明 注解是将元数据附加到代码的方法.要声明注解,请将 annotation 修饰符放在类的前面: annotation class Fancy 注解的附加属性可以通过用元注解标注注解类来指定: @Target 指定可以用 该注解标注的元素的可能的类型(类.函数.属性.表达式等): @Retention 指定该注解是否 存储在编译后的 class 文件中,以及它在运行时能否通过反射可见 (默认都是 true): @Repeatable 允许 在单个元素上多次

Kotlin实现多函数接口的简化调用

对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的.可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法.在Java中也有简化接口调用的方式,比如安卓中ViewPager监听页面切换时的接口PageChangeListener,官方提供了简单类: ViewPager.SimpleOnPageChangeListener来简化调用. 对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到ob

Kotlin实现静态方法

工具类 全都是静态方法的情况 : class 类名 改为 object 类名 即可 package redwolf.com.moreimageupload import okhttp3.MultipartBody import java.io.File /** * @作者 RedWolf * @时间 2017/5/20 10:52 * @简介 MoreImageUtils.kt */ object MoreImageUtils { fun filesToMultipartBodyParts(fi

Kotlin开发Android应用实例详解

Kotlin开发Android应用实例详解 相关文章:关于Kotlin语言的基础介绍: http://www.jb51.net/article/114086.htm 我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈.那么,我们该如何在Android中应用这门新的语言呢?今天的这篇文章带你学习使用Kotlin开发Android应用,并对比我们传统语言Java,让你真真切切的感受到他的美和优雅. 配置 项目g

Kotlin 基础教程之数组容器

Kotlin 基础教程之数组容器 Arrays Kotlin 标准库提供了arrayOf()创建数组, **ArrayOf创建特定类型数组 val array = arrayOf(1, 2, 3) val countries = arrayOf("UK", "Germany", "Italy") val numbers = intArrayOf(10, 20, 30) val array1 = Array(10, { k -> k * k

使用Kotlin开发Android应用教程

使用Kotlin开发Android应用 1.Kotlin介绍 [Kotlin](https://kotlinlang.org/) Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者.Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进. Java缺失的很多特性在最新的修订版中逐渐覆盖到了,但Android开发者暂时还没能够使用它们.这就使得类似Kotlin这样的语言有了用武之地了:

Kotlin 开发环境详解及简单实例

Hello Kotlin 在前段时间举办的Google I/O 2017上,Google宣布Kotlin成为Android官方的开发语言,这个最初发布于2011年的语言在短短的时间内就吸引了大量的开发者,而Google使得它进入了更多人的视线. Kotlin是一种开源的基于JVM的变成语言,由JetBeans公司开发(大概除了使用VS的.net开发者意外,都会或多或少听说或使用过IDEA吧),名字取自圣彼得堡附近的一个小岛(Koltin island). Kotlin是一种简单的语言,其主要目标

JSP 注释的详解及简单实例

 JSP 注释的详解及简单实例 一 三种格式 二 举例 <body> <h1>大家好</h1> <hr> <!-- 我是HTML注释,在客户端可见 --> <%-- 我是JSP注释,在客户端不可见 --%> <% //单行注释 /*多行注释*/ out.println("大家好,欢迎大家学习JAVAEE开发."); %> <br> 你好,<%=s %><br> x+y

MySQL 复制详解及简单实例

MySQL 复制详解及简单实例 主从复制技术在MySQL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务器,可以用于实现负载均衡,高可用和故障切换,以及提供备份等等.MySQL支持多种不同的复制技术,诸如单向,半同步异步复制等以及不同级别的复制,诸如数据库级别,表级,跨库同步等等.本文简要描述了一个基本的主从复制并给出示例. 1.复制的基本原理(步骤) a.在主库上把数据更改记录的二进制日志(binary log)     b.从库上的I/O线程连接到主库并请求发送其二进制日志文件(主库

基于Python_脚本CGI、特点、应用、开发环境(详解)

CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口. CGI程序可以是Python脚本.Perl脚本.Shell脚本.C或者C++程序等. 服务器 在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序. 所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录.这个目录被称为CGI目录,并按照惯例,它被

mybatis分页插件pageHelper详解及简单实例

mybatis分页插件pageHelper详解及简单实例 工作的框架spring springmvc mybatis3 首先使用分页插件必须先引入maven依赖,在pom.xml中添加如下 <!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.7.5

Java File类的详解及简单实例

Java File类的详解及简单实例 1. File():构造函数,一般是依据文件所在的指定位置来创建文件对象.  CanWrite():返回文件是否可写. CanRead():返回文件是否可读. CompareTo(File pathname):检查指定文件路径间的顺序. Delet():从文件系统内删除该文件. DeleteOnExit():程序顺利结束时从系统中删除文件. Equals(Object obj):检查特定对象的路径名是否相等. Exists():判断文件夹是否存在. GetA

JAVA 注解详解及简单实例

JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖性  可以通过注解替代配置文件,简化项目的配置.现有的许多框架都采用这个功能减少自己的配置. 编译检查  在编译时进行格式检查,例如@Override 基础注解 Java目前内置了三种标准注解,以及四种元注解.四种元注解负责创建其他的注解. 三种标准注解 @Override,表示当前的方法覆盖超类中

微信小程序中input标签详解及简单实例

微信小程序中input标签详解及简单实例 使用input标签,我们都会,在微信小程序中使用,必定也是可以一下子就会的,但是却有些常用的属性无法按照习惯去使用: 我就用我最常用的来做例子: 一个一个来解读: 首先,我是定义了他的id,这是我们最常用的,所以就配了一个id,毕竟不操作他,又为什么设成输入框呢, 第二,设置他的样式, 第三,设置他的输入类别,以上都是很简单的 第四.使用正则l:哎限定输入为纯数字.这点可能有点不理解,这是对他的keyup事件监听,将不是纯数字的list无视掉.注意,是对

linux 下实现sleep详解及简单实例

linux 下实现sleep详解及简单实例 sleep: 普通版本 1.基本设计思路: 1>注册SIGALRM信号的处理函数:    2>调用alarm(nsecs)设定闹钟: 3>调⽤pause等待,内核切换到别的进程运行: 4>nsecs秒之后,闹钟超时,内核发SIGALRM给这个进程 ; 5>从内核态返回这个进程的⽤户态之前处理未决信号,发现有SIGALRM信号,其处理函数是sig_alrm; 6> 切换到用户态执行sig_alrm函数,进⼊sig_alrm函数时

Golang与python线程详解及简单实例

Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var cccc int var m *sync.Mutex func Count1(i int, ch chan int) { for j := 0; j < 100000; j++ { cccc = cccc + 1 } ch <- cccc } func main() { m = new(sync.