Kotlin基础(一)Kotlin快速入门

Kotlin快速入门

一、函数

 1 /*
 2 *  1.函数可以定义在文件最外层,不需要把它放在类中
 3 *  2.可以省略结尾分号
 4 * */
 5 fun main(args: Array<String>) {
 6     println(max2(1,2))
 7     println(max(3,5))
 8 }
 9
10 fun max(a: Int, b: Int): Int{
11     return if (a>b) a else b
12 }
13
14 /*
15 *  与Java不同,Kotlin中,除了循环(for、do和do/while)
16 *  以外大多数控制结构都是表达式,而不是语句(表达式和语句的区别?)。
17 *  所以可以有如下写法。既然有了值(可推断返回类型),就可以省略返回类型。注意,只有
18 *  表达式体函数的返回类型可以省略,对于有返回值的代码块体函数不可省略(这么设计的好处?)。
19 * */
20 fun max2(a: Int, b: Int)=if (a>b) a else b

二、变量

 1 fun main(args: Array<String>) {
 2     //声明变量的三种方式
 3     val a="For the Lichking!"
 4     val b: Int=88
 5     val c=8.8e8
 6     val d: String
 7     d="ssss"
 8
 9    /*
10    * 声明变量的关键字有两个:
11    * val(来自value),不可变引用。相当于Java中的final变量。
12    * var(来自variable),可变引用(不同于Javascript,类型仍然不可变)。
13    * 相当于Java中的普通变量
14    * */
15
16
17     /*
18     * 如果编译器能确保只有唯一一条初始化语句被执行,可根据条件使用不同值初始化它。
19     * */
20     val message: String
21     val isTrue: Boolean=true
22     if (isTrue) message="true" else message="false"
23 }

三、字符串模板

1 fun main(args: Array<String>) {
2     //只需要在变量名前加"$"就可以在字符串字面量中引用变量
3     val name=if (args.isNotEmpty()) args[0] else "Kotlin"
4     println("Hello,${name}")
5
6     //还可以这么玩儿
7     println("Hello,${if (args.isNotEmpty()) args[0] else "NoJava"}")
8 }

四、类

1.java类

 1 public class Person {
 2     private final String name;
 3
 4     public Person(String name){
 5         this.name=name;
 6     }
 7
 8     public String getName() {
 9         return name;
10     }
11 }

转换为Kotlin类

1 //这种只有数据没有其他代码的类,通常被叫做值对象
2 class Person(val name: String)

属性:

 1 /*
 2 *  在Java中,字段和其访问器的组合叫做属性。
 3 *  Kotlin的类中声明一个变量就是声明一个属性。
 4 * */
 5 class Man(
 6         val name:String, //只读属性:生成字段和其getter
 7         var isMarried:Boolean) //可写属性:生成字段和getter、setter
 8
 9 class Rectangle(val height: Int,val width: Int){
10     val isSquare: Boolean
11     //自定义访问器
12     /*get() {
13         return height==width
14     }*/
15
16     get() = height==width
17 }
18
19 fun main(args: Array<String>) {
20     val tang=Man("Tang Jiujia",false)
21     println("My name is ${tang.name}")
22
23     val rectangle=Rectangle(22,33)
24     println(rectangle.isSquare)
25 }

五、目录和包

 1 package gemetry.shapes
 2
 3 import java.util.*
 4
 5 class Rectangle(val height:Int,val width: Int){
 6     val isSquare: Boolean
 7         get() = height==width
 8 }
 9
10 //顶层函数
11 fun createRectangle(): Rectangle{
12     val random = Random()
13     return Rectangle(random.nextInt(),random.nextInt())
14 }
15
16 //Kotlin中,可以把多个类放在同一个文件中,文件的名字还可以随意取
17 //因此可以不创建shapes文件夹,直接用shapes文件代替文件夹。
18 //当然,坚持Java的目录文件结构仍然是个不错的选择
19 class RectangleUtil()
1 package gemetry.example
2
3 //可以这样导入顶层函数,当然使用"*"时顶层函数也会被导入
4 import gemetry.shapes.createRectangle
5
6 fun main(args: Array<String>) {
7     println("Height: ${createRectangle().height}"+"\n"+"Width: ${createRectangle().width}")
8 }

六、表示和处理选择:枚举和when

 1 package gemetry.enums
 2
 3 enum class Color(val r: Int,val g: Int,val b:Int){
 4     RED(255,0,0),ORANGE(255,165,0),YELLOW(255,255,0),
 5     GREEN(0,255,0),BLUE(0,0,255); //这里分号不能省略,如果要在枚举类
 6     //中定义任何方法,必须用分号把常量列表和方法分开。
 7
 8     //同Java一样,可以在枚举类中声明属性和方法
 9     fun rgb()=(r*256+g)*256+b
10 }
11
12 fun getMc(color: Color)=
13         when (color){
14             Color.BLUE -> "blue"
15             //不写"break"
16             //可以多个情况一起
17             Color.GREEN,Color.RED -> "green or red"
18             //必须把所有的可能的情况都列出来,不然就用"else"
19             Color.YELLOW,Color.ORANGE ->"others"
20         }
21
22 fun mix(c1: Color,c2: Color)=
23         //与Java中的switch只能使用常量(枚举常量、字符串、数字字面量)
24         //不同,when允许使用任何对象,任何表达式
25         when (setOf<Color>(c1,c2)){
26             setOf(Color.RED,Color.YELLOW) -> "orange"
27             setOf(Color.YELLOW,Color.BLUE) ->"GREEN"
28             setOf(Color.BLUE,Color.RED) -> "unknow"
29             else -> "???"
30         }
31
32 fun mix2(c1: Color,c2: Color)=
33         //不带参数的when
34         when{
35             (c2==Color.RED && c2==Color.YELLOW) ||
36                     (c1==Color.YELLOW && c2==Color.RED) -> "orange"
37             else -> "others"
38         }
39
40 fun main(args: Array<String>) {
41     println(getMc(Color.ORANGE))
42     println(mix(Color.YELLOW,Color.BLUE))
43     println(mix2(Color.RED,Color.GREEN))
44 }

七、智能转换和“代码块最后表达式就是结果”

 1 package gemetry
 2
 3
 4 interface Expr
 5 class Num(val value: Int) : Expr //实现了Expr
 6 class Sum(val left: Expr,val right: Expr) : Expr
 7 /*
 8 fun eval(e: Expr) : Int=
 9         if (e is Num) e.value
10         else if (e is Sum) eval(e.right)+ eval(e.left)
11         else throw IllegalArgumentException("Unknown expression")*/
12
13 fun eval(e: Expr): Int=
14         //when表达式不仅限于检查值是否相等,也可用于检测when实参类型。
15         when(e){
16             is Num -> e.value //"is" 判断后自动转换为该类型
17         // (被判断的属性必须是一个val属性,而且不能有自定义访问器)
18             is Sum -> eval(e.right) + eval(e.left)
19             else -> throw IllegalArgumentException("Unknown expression")
20         }
21
22 fun evalWithLogging(e: Expr) : Int=
23         when(e){
24             is Num -> {
25                 println("num: ${e.value}")
26                 e.value //代码快的最后一个表达式就是结果
27                 /*
28                 * 规则-----“代码块中最后的表达式就是结果”,在所有使用代码块并期望得到一个
29                 * 结果的地方成立。但是,这个规则对常规函数不成立。一个函数要么具有不是代码
30                 * 块的表达式函数体,要么具有包含显示return语句的代码块函数体。
31                 * */
32             }
33
34             is Sum -> {
35                 val left= evalWithLogging(e.left)
36                 val right= evalWithLogging(e.right)
37                 println("sum: $left+$right")
38                 left+right
39             }
40             else -> {
41                 throw IllegalArgumentException("Unknown Expression")
42             }
43         }
44
45 fun main(args: Array<String>) {
46     println(eval(Sum(Sum(Num(1),Num(3)),Num(3))))
47     println(evalWithLogging(Sum(Sum(Num(1),Num(3)),Num(3))))
48 }

八、迭代

1.when 同Java中一样

2.for: 仅以for-each循环的形式存在 for <item> in <elements>

3.while:同Java

4.区间:为了代替Java中的普通for循环。区间本质就是值之间的间隔,这两个值通常是数字:一个起始值,一个结束值。使用..运算符表示。

能迭其所有值的区间,叫做数列。

1 val i: Int=0
2     for (i in 1..10){
3         println(i)
4     }
1 val i: Int=0
2     //反向迭代,步长为2
3     for (i in 20 downTo 1 step 2) println(i)

5.迭代map

 1 fun main(args: Array<String>) {
 2     val binaryReps=TreeMap<Char,String>()
 3
 4     for (c in ‘A‘..‘F‘) { //区间迭代字符
 5         val binary=Integer.toBinaryString(c.toInt())
 6         binaryReps[c]=binary //根据键来更新map的简明语法
 7     }
 8
 9     for ((l,b) in binaryReps) println("$l=$b") //迭代map
10 }

6.使用in来检查值是否在区间中

1 fun isLetter(c: Char)= c in ‘a‘..‘z‘ || c in ‘A‘..‘Z‘
2 fun isNotDigit(c: Char)=c !in ‘0‘..‘9‘ //不在区间中
println("Kotlin" in "Java".."Scala")//字符串是按字母顺序表比较
    // (因为String就是这样实现Comparable接口的)

九、异常

1.Kotlin并不区分受检异常和非受检异常,因此函数可以不抛出特定异常,异常可以被处理或者不处理。

2.“try”可以作为一个表达式。

时间: 2024-10-08 02:52:28

Kotlin基础(一)Kotlin快速入门的相关文章

Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应用! Spring Boot让我们的Spring应用变的更轻量化.我们不必像以前那样繁琐的构建项目.打包应用.部署到Tomcat等应用服务器中来运行我们的业务服务.通过Spring Boot实现的服务,只需要依靠一个Java类,把它打包成jar,并通过j

【夯实Ruby基础】Ruby快速入门

本文地址: http://www.cnblogs.com/aiweixiao/p/6664301.html 文档提纲 扫描关注微信公众号 1.Ruby安装 1.1)[安装Ruby] Linux/Unix 上的 Ruby 安装 Windows 上的 Ruby 安装 $ sudo yum install ruby # CentOS, Fedora, 或 RHEL 系统 或 sudo apt-get install ruby-full # Debian 或 Ubuntu 系统 $ brew insta

前端基础之CSS快速入门

前一篇写了我们的Html的常用组件,当然那些组件在我们不去写样式的时候都是使用的浏览器的默认样式,可以说是非常之丑到爆炸了,我们肯定是不能让用户去看这样丑到爆炸的样式,所以我们在这里需要使用css样式来美化一下前面的组件,让我们的页面更美观. 在开始css这部分之前,我们需要先在此着重提一下div这个标签,div标签在网页的标准化布局上起到了决定性的因素,我们通过使用div+css,可以完美的让我们的每个组件去到它自己应该去的地方. <div></div> 我们在学习css样式前,

Kotlin快速入门(一)基础

Kotlin快速入门(一)基础 Kotlin学习笔记,主要记录与Java不同的地方. 1 基本类型 1.1 数字 1)数字没有隐式扩宽转换 val b: Byte = 1 // OK, 字面值是静态检测的 val i: Int = b // 错误 但我们可以显示转换 val i: Int = b.toInt() 上下文推断转换类型是可以的 val l = 1L + 3 // Long + Int => Long 2)Kotlin中字符不是数字,但字符可以显示转换为数字 fun check(c:

Kotlin的快速入门

Kotlin 快速入门: Kotlin 的 Hello World : #hellokotlin.kt fun main(args:Array<String>){ println("hello kotlin!"); } Kotlin 的 变量和常量 : 1 // eclipse 中运行的快捷键是 ctrl + f11 2 fun main(args:Array<String>){ 3 var i = 18; //变量 4 println(i); 5 6 val

Kotlin基础-数据类

/* * 数据类:专用于只"保存"数据的类,比如用户自动登录信息,聊天记录等 * 这里的保存并不是指保存到磁盘,而是指转换成文本格式,便于保存 * Kotlin数据类:data class 类名(属性列表) * * */ data class Article(var id:Int,var title:String,var content:String) fun main(args: Array<String>) { val artical=Article(1001,&quo

一起学Google Daydream VR开发,快速入门开发基础教程一:Android端开发环境配置一

原文因涉及翻墙信息,被强制删除,此文为补发! 准备工作 进入Google Daydream开发者官网,开启准备工作,官网地址:https://vr.google.com/daydream/developers/ -------------------------------------------------------------------------------------------------------------------- Google Daydream开发者网址: https

程序员带你学习安卓开发,十天快速入门-基础知识(四)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 本系列课程是.Net程序员学习安卓开发系列课程. 下面是前三次课程列表: 程序员带你学习安卓开发,十天快速入门-安卓学习必要性 程序员带你学习安卓开发,十天快速入门-开发工具配置学习 程序员带你学习安卓开发,十天快速入-对比C#学习java语法 为了大家系统有效的快速入门安卓开发,推荐

【Solr基础教程之一】Solr快速入门

一.Solr学习相关资料 1.官方材料 (1)快速入门:http://lucene.apache.org/solr/4_9_0/tutorial.html,以自带的example项目快速介绍发Solr的基础使用. (2)API:http://lucene.apache.org/solr/4_9_0/index.html (3)reference:PDF格式,apache-solr-ref-guide-4.9.pdf 2.书籍 (1)Solr in Action,基于4.7版本,极力推荐,此书适合