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

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

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

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点击事件的方法

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

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

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

Android Kotlin的使用及简单实例

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

Kotlin 的注解类详解及实例

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

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

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

使用Kotlin开发Android应用教程

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

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中如何实现类似Java或C#中的静态方法

大家可以在网络上搜到不少这样的文章,官方推荐是包级函数,也有人说用伴生对象(companion class).这些都是不错的选择,但并不完善,我们在不同的情况下有更好的选择.我总结了几种方法,分别是:包级函数.伴生对象.扩展函数和对象声明.这需要大家根据不同的情况进行选择. 一.包级函数 Kotlin和Java及C#不同的是,可以在包里面直接声明函数.做法和类中是一样的,这里就不多说了,的确是一个非常好的选择.适用于函数不需要不包内部的类进行数据共享的方法. 二.伴生对象 从语义上来讲,伴生函数

Android 使用Kotlin自定义View的方法教程

前言 随着google宣布kotlin作为官方开发语言,在Android中使用kotlin的趋势也越来越明显,最近被kotlin的文章轰炸了,所以决定上手试一下,试过之后,感觉靠它灵简直有魔性.特别是一句话写出一个复杂的循环的时候,简直被惊呆.而且使用AS,Java代码可以直接转成Kotlin. 效果图如下: 首先是这次自定义View的效果图,是一张饼图.如果是用java写的话也就几十行,觉得换成Kotlin的话可能会更少. 示例代码 主要的功能是可以任设定数据的个数,我这里是4个数据,可以任意

Kotlin使用静态变量与静态方法详解

前言 在日常开发过程中,静态变量和  静态方法 是我们常见的用法,Java中相信大家并不陌生了,那么在 Kotlin 中该如何使用呢? 其实很简单,只需要一个将变量和方法包含在 companion object 域中即可,比如这样: class Constant { companion object { // 接口根地址 const val BASE_URL = "http://xxxx.xxx.xxx/" // 友盟 const val UMENG_APP_KEY = "x

Kotlin学习第一步 kotlin语法特性

今年 Google I/O 2017 开发者大会中,Google 宣布正式把 Kotlin 纳入 Android 程序的官方一级开发语言(First-class language),作为Android开发者,当然要逐步熟悉这门语言,第一步就要从语法开始学习. 在这之前,我们需要了解怎么使用Kotlin编写一个Android应用.对于Android Studio 3.0版本,我们在创建工程的时候直接勾选 Include Kotlin support 选项就可以了:对于3.0以前的版本,我们需要安装

Kotlin 基础教程之类、对象、接口

Kotlin 基础教程之类.对象.接口 Kotlin中类.接口相关概念与Java一样,包括类名.属性.方法.继承等,如下示例: interface A { fun bar() fun foo() { // 可选方法体 } } class Child: A { override fun bar() { // todo } override fun foo() { super.foo() } } class 构造器 Kotlin 中的类可以有一个 主构造器, 以及一个或多个次构造器, 主构造器是类头

详解 Kotlin Reference Basic Types, String, Array and Imports

详解 Kotlin Reference  Basic Types, String, Array and Imports 基本数据类型 Kotlin中支持的基本数据类型及它所占Bit宽度: Type Bit width Double 64 Float 32 Long 64 Int 32 Short 16 Byte 8 Char 在kotlin中 并不是一个数值类型 kotlin不支持8进制, 支持 2.10.16进制 下面的代码,示例了: 关于2.10.16进制: 使用下划线在数值常量赋值数据中:

Kotlin语法学习-变量定义、函数扩展、Parcelable序列化等简单总结

Kotlin语法学习-变量定义.函数扩展.Parcelable序列化等简单总结 今年 Google I/O 2017 开发者大会中,Google 宣布正式把 Kotlin 纳入 Android 程序的官方一级开发语言(First-class language),作为Android开发者,当然要逐步熟悉这门语言,第一步就要从语法开始学习. 在这之前,我们需要了解怎么使用Kotlin编写一个Android应用.对于Android Studio 3.0版本,我们在创建工程的时候直接勾选 Include

Kotlin 编程三分钟入门

为什么使用Kotlin 项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受.因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人会尝试这样一门小众语言,但是习惯后会发现这些年究竟浪费多少时间在写无用的Java代码了,Kotlin在兼容Java的基础上还能大大提升开发效率.Kotlin有许多特性但对于开发来说,快速适应和学习更为重要,很多时候我们都是在不明白其原因就开始使用的,正如我们不可能把Retrofit原理研究透才使用它

kotlin改善java代码实例分析

序 本文主要举几个kotlin如何改善java代码的例子 字符串字面值及模板 字符串字面值 @Test fun testStringLiterals(){ val a = """if(a > 1) { | return a |}""".trimMargin() println(a) val b = """Foo Bar""".trimIndent() println(b) } 有了