Kotlin基础(一)Kotlin快速入门
Kotlin快速入门
一、函数
/*
* 1.函数可以定义在文件最外层,不需要把它放在类中
* 2.可以省略结尾分号
* */
fun main(args: Array<String>) {
println(max2(1,2))
println(max(3,5))
} fun max(a: Int, b: Int): Int{
return if (a>b) a else b
} /*
* 与Java不同,Kotlin中,除了循环(for、do和do/while)
* 以外大多数控制结构都是表达式,而不是语句(表达式和语句的区别?)。
* 所以可以有如下写法。既然有了值(可推断返回类型),就可以省略返回类型。注意,只有
* 表达式体函数的返回类型可以省略,对于有返回值的代码块体函数不可省略(这么设计的好处?)。
* */
fun max2(a: Int, b: Int)=if (a>b) a else b
二、变量
fun main(args: Array<String>) {
//声明变量的三种方式
val a="For the Lichking!"
val b: Int=88
val c=8.8e8
val d: String
d="ssss"
/*
* 声明变量的关键字有两个:
* val(来自value),不可变引用。相当于Java中的final变量。
* var(来自variable),可变引用(不同于Javascript,类型仍然不可变)。
* 相当于Java中的普通变量
* */
/*
* 如果编译器能确保只有唯一一条初始化语句被执行,可根据条件使用不同值初始化它。
* */
val message: String
val isTrue: Boolean=true
if (isTrue) message="true" else message="false"
}
三、字符串模板
fun main(args: Array<String>) {
//只需要在变量名前加"$"就可以在字符串字面量中引用变量
val name=if (args.isNotEmpty()) args[0] else "Kotlin"
println("Hello,${name}")
//还可以这么玩儿
println("Hello,${if (args.isNotEmpty()) args[0] else "NoJava"}")
}
四、类
1.java类
public class Person {
private final String name;
public Person(String name){
this.name=name;
}
public String getName() {
return name;
}
}
转换为Kotlin类
//这种只有数据没有其他代码的类,通常被叫做值对象
class Person(val name: String)
属性:
/*
* 在Java中,字段和其访问器的组合叫做属性。
* Kotlin的类中声明一个变量就是声明一个属性。
* */
class Man(
val name:String, //只读属性:生成字段和其getter
var isMarried:Boolean) //可写属性:生成字段和getter、setter class Rectangle(val height: Int,val width: Int){
val isSquare: Boolean
//自定义访问器
/*get() {
return height==width
}*/ get() = height==width
} fun main(args: Array<String>) {
val tang=Man("Tang Jiujia",false)
println("My name is ${tang.name}") val rectangle=Rectangle(22,33)
println(rectangle.isSquare)
}
五、目录和包
package gemetry.shapes
import java.util.*
class Rectangle(val height:Int,val width: Int){
val isSquare: Boolean
get() = height==width
}
//顶层函数
fun createRectangle(): Rectangle{
val random = Random()
return Rectangle(random.nextInt(),random.nextInt())
}
//Kotlin中,可以把多个类放在同一个文件中,文件的名字还可以随意取
//因此可以不创建shapes文件夹,直接用shapes文件代替文件夹。
//当然,坚持Java的目录文件结构仍然是个不错的选择
class RectangleUtil()
package gemetry.example //可以这样导入顶层函数,当然使用"*"时顶层函数也会被导入
import gemetry.shapes.createRectangle fun main(args: Array<String>) {
println("Height: ${createRectangle().height}"+"\n"+"Width: ${createRectangle().width}")
}
六、表示和处理选择:枚举和when
package gemetry.enums
enum class Color(val r: Int,val g: Int,val b:Int){
RED(255,0,0),ORANGE(255,165,0),YELLOW(255,255,0),
GREEN(0,255,0),BLUE(0,0,255); //这里分号不能省略,如果要在枚举类
//中定义任何方法,必须用分号把常量列表和方法分开。
//同Java一样,可以在枚举类中声明属性和方法
fun rgb()=(r*256+g)*256+b
}
fun getMc(color: Color)=
when (color){
Color.BLUE -> "blue"
//不写"break"
//可以多个情况一起
Color.GREEN,Color.RED -> "green or red"
//必须把所有的可能的情况都列出来,不然就用"else"
Color.YELLOW,Color.ORANGE ->"others"
}
fun mix(c1: Color,c2: Color)=
//与Java中的switch只能使用常量(枚举常量、字符串、数字字面量)
//不同,when允许使用任何对象,任何表达式
when (setOf<Color>(c1,c2)){
setOf(Color.RED,Color.YELLOW) -> "orange"
setOf(Color.YELLOW,Color.BLUE) ->"GREEN"
setOf(Color.BLUE,Color.RED) -> "unknow"
else -> "???"
}
fun mix2(c1: Color,c2: Color)=
//不带参数的when
when{
(c2==Color.RED && c2==Color.YELLOW) ||
(c1==Color.YELLOW && c2==Color.RED) -> "orange"
else -> "others"
}
fun main(args: Array<String>) {
println(getMc(Color.ORANGE))
println(mix(Color.YELLOW,Color.BLUE))
println(mix2(Color.RED,Color.GREEN))
}
七、智能转换和“代码块最后表达式就是结果”
package gemetry interface Expr
class Num(val value: Int) : Expr //实现了Expr
class Sum(val left: Expr,val right: Expr) : Expr
/*
fun eval(e: Expr) : Int=
if (e is Num) e.value
else if (e is Sum) eval(e.right)+ eval(e.left)
else throw IllegalArgumentException("Unknown expression")*/ fun eval(e: Expr): Int=
//when表达式不仅限于检查值是否相等,也可用于检测when实参类型。
when(e){
is Num -> e.value //"is" 判断后自动转换为该类型
// (被判断的属性必须是一个val属性,而且不能有自定义访问器)
is Sum -> eval(e.right) + eval(e.left)
else -> throw IllegalArgumentException("Unknown expression")
} fun evalWithLogging(e: Expr) : Int=
when(e){
is Num -> {
println("num: ${e.value}")
e.value //代码快的最后一个表达式就是结果
/*
* 规则-----“代码块中最后的表达式就是结果”,在所有使用代码块并期望得到一个
* 结果的地方成立。但是,这个规则对常规函数不成立。一个函数要么具有不是代码
* 块的表达式函数体,要么具有包含显示return语句的代码块函数体。
* */
} is Sum -> {
val left= evalWithLogging(e.left)
val right= evalWithLogging(e.right)
println("sum: $left+$right")
left+right
}
else -> {
throw IllegalArgumentException("Unknown Expression")
}
} fun main(args: Array<String>) {
println(eval(Sum(Sum(Num(),Num()),Num())))
println(evalWithLogging(Sum(Sum(Num(),Num()),Num())))
}
八、迭代
1.when 同Java中一样
2.for: 仅以for-each循环的形式存在 for <item> in <elements>
3.while:同Java
4.区间:为了代替Java中的普通for循环。区间本质就是值之间的间隔,这两个值通常是数字:一个起始值,一个结束值。使用..运算符表示。
能迭其所有值的区间,叫做数列。
val i: Int=0
for (i in 1..10){
println(i)
}
val i: Int=0
//反向迭代,步长为2
for (i in 20 downTo 1 step 2) println(i)
5.迭代map
fun main(args: Array<String>) {
val binaryReps=TreeMap<Char,String>()
for (c in 'A'..'F') { //区间迭代字符
val binary=Integer.toBinaryString(c.toInt())
binaryReps[c]=binary //根据键来更新map的简明语法
}
for ((l,b) in binaryReps) println("$l=$b") //迭代map
}
6.使用in来检查值是否在区间中
fun isLetter(c: Char)= c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char)=c !in '0'..'9' //不在区间中
println("Kotlin" in "Java".."Scala")//字符串是按字母顺序表比较
// (因为String就是这样实现Comparable接口的)
九、异常
1.Kotlin并不区分受检异常和非受检异常,因此函数可以不抛出特定异常,异常可以被处理或者不处理。
2.“try”可以作为一个表达式。
Kotlin基础(一)Kotlin快速入门的更多相关文章
- web前端基础知识及快速入门指南
web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...
- Spring Boot 2.x基础教程:快速入门
简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...
- SpringBoot基础篇-SpringBoot快速入门
SpringBoot基础 学习目标: 能够理解Spring的优缺点 能够理解SpringBoot的特点 能够理解SpringBoot的核心功能 能够搭建SpringBoot的环境 能够完成applic ...
- 0基础如何更快速入门Linux系统?学完Linux有哪些就业方向?
Linux系统是使用Linux内核及开源自由软件组成的一套操作系统,是一种类UNIX系统,其内核在1991年10月5日由林纳斯·托瓦兹首次发布. 它的主要特性:Linux文件一切皆文件.完全开源免费. ...
- 【APICloud】APICloud基础学习与快速入门
前言:回顾这几天学习情况,总的来说APICloud官网它的学习资料和社区还是足够了,但是我必须吐槽一句,实在是过于混乱了,视频资料文档资料它一股脑地都堆在了那里,这几天基本处于在各个地方跳转,然后现在 ...
- 【夯实Ruby基础】Ruby快速入门
本文地址: http://www.cnblogs.com/aiweixiao/p/6664301.html 文档提纲 扫描关注微信公众号 1.Ruby安装 1.1)[安装Ruby] Linux/Uni ...
- 前端基础之CSS快速入门
前一篇写了我们的Html的常用组件,当然那些组件在我们不去写样式的时候都是使用的浏览器的默认样式,可以说是非常之丑到爆炸了,我们肯定是不能让用户去看这样丑到爆炸的样式,所以我们在这里需要使用css样式 ...
- 前端基础之HTML快速入门
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- pl/sql基础知识—函数快速入门
n 函数 函数用于返回特定的数据,当建立函数式,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据,我们可以使用create function来建立函数,实际案例: ...
- pl/sql基础知识—过程快速入门
n 过程 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数可以将执行部分的数据传递 ...
随机推荐
- 基于Manhattan最小生成树的莫队算法
点u,v的Manhattan距离:distance(u,v)= |x2-x1|+|y2-y1| Manhattan最小生成树:边权值为两个点Manhattan距离的最小生成树. 普通算法:prim复杂 ...
- 在一些开源框架中,dist文件夹是什么意思
全称是distribution. distribution英 [dɪstrɪ'bjuːʃ(ə)n]美 ['dɪstrə'bjʊʃən]: 发行版 n. 分布:分配 在某些框架中,因为开发和发布是的内容 ...
- 理解并设计rest/restful风格接口
网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...
- springboot动态多数据源切换
application-test.properties #datasource -- mysql multiple.datasource.master.url=jdbc:mysql://localho ...
- Python深度学习案例1--电影评论分类(二分类问题)
我觉得把课本上的案例先自己抄一遍,然后将书看一遍.最后再写一篇博客记录自己所学过程的感悟.虽然与课本有很多相似之处.但自己写一遍感悟会更深 电影评论分类(二分类问题) 本节使用的是IMDB数据集,使用 ...
- JavaScript编程语言
JavaScript编程语言 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应 ...
- file /usr/share/mysql/charsets/README from install of MySQL-server-5.1.73-1.glibc23.i386 conflicts with file from package mysql-libs-5.1.73-8.el6_8.i686
1:也许之前的机器安装过Mysql,但是自己不知道,账号密码也忘记了,又执行安装操作,导致Mysql不兼容问题.Linux上安装MySQL时出现不兼容的解决办法,错误如下所示: [root@maste ...
- 【Android】jar包Proguard混淆方法
本文章的前提条件是,读者已经掌握了正确导出jar包的技能. 1.拷贝Android项目中“proguard.cfg”文件到你指定的位置,并改名为“proguard.pro”,此步是为proguardg ...
- python 链接数据库错误
用python3链接oracle产生错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified mo ...
- HTML中鼠标滚轮事件onmousewheel
IE/Opera属于同一类型,使用attachEvent即可添加滚轮事件. /*IE注册事件*/ if(document.attachEvent){ document.attachEvent('onm ...