Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。
按照JetBrains的说法,根据他们多年的Java平台开发经验,他们认为Java编程语言有一定的局限性和问题,而且由于需要向后兼容,它们不可能或很难得到解决。因此,他们创建了Kotlin项目,主要目标是:
· 创建一种兼容Java的语言
· 编译速度至少同Java一样快
· 比Java更安全
· 比Java更简洁
· 比最成熟的竞争者Scala还简单
本文的目的只是简单的介绍Kotlin基本特性,主要介绍Kotlin在Android上的运用以及与java的对比。
fun main(args: Array<String>) {
println("Hello, world!")
}
kotlin和java一样,一个执行文件有一个入口执行函数main.
用fun来定义一个方法,不同的是他可以在方法内部嵌套定义。(高阶函数)
fun foo(s: String): String { fun localFoo(): Int { return 42 } return s + localFoo() }
还可以直接定义一个方法返回一个简单的式子,这点有点像C++的宏。
fun PI() = 3.14
用var来定义变量,变量类型写在变量名后。
var a:String
Java中8种基本类型对应kotlin中的基本类型名:
var s="abc" var s:String="abc"
String类的变量可以用下标访问:s[i],可以使用加号连接两个String。
使用”””符号可以按输入格式打印图案。
var text=""" * *** ***** *** * """
print(text)
还可以这样使用字符串模板:
val i = 10 val s = "i = $i"
8种基本类型变量有对用的Array,例如:IntArray对应int[]。
其他的类用Array<T>对应T[],例如Array<String> 对应String[],Array<T>不能用下标访问。
var array:IntArray=IntArray(5);
var j:Int=0;
for(i in array.indices)
{
array[i]=j++;
}
for(i in array)
{
print(i)
}
public fun get(index:Int): Int
public fun set(index: Int, value: Int): Unit
public fun size(): Int
public fun iterator(): IntIterator
Class来定义一个类,可以在定义类的时候指明构造方法。可以使用constructor创建辅助构造函数。
class 默认的访问类型是internal和final的,只能在一个包内部访问,可修改的访问类型为public private、protect。如果想让一个类继承,需要用open标注。
open class A (){
var i:Int=0;
fun print(){
println("A"+i)
i++;
}
}
class B(name:String,id:String,num:Int){
var name:String?=name
var id:String?=id
var num:Int?=num;
constructor(name:String,id:String) : this(name,id,0) {
this.name=name;
this.id=id;
}
}
val r1 = 1..5
val r2 = 5 downTo 1
val r3 = 5 downTo 1 step 2
使用Kotlin,可以更容易的避免创建模版型代码,因为大多数经典的情景都默认包含在Kotlin中。例如,在java中,我们想要创建一个典型的data class时需要这样做:
public class Artist { private long id; private String name; private String url; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
Kotlin中有专门的数据类:data
dataclass Artist(var id: Long, var name: String, var url: String)
这样定义一个类之后,可以有如下的构造方法。
class B(name:String="",id:String="",num:Int=0){
……
}
b=B("haha")
b=B("gaga","gaga")
b:B=B("hah","ad",123)
b=B(num=123);
b=B("234",num=123);
如果不能满足就需要,用辅助构造函数。
们可以给任何类添加新方法。这比我们在project中使用的工具类可读性更高。
比如:
fun String.odd():String { var res: String = "" for (i in this.indices) if (i % 2 == 1) res = res + this[i] return res }
在android中,我们可以给Fragment添加一个新方法来显示Toast。
fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(getActivity(), message, duration).show() }
我们可以这样使用:
fragment.toast("Hello world!") fragment.toast("Long Toast!!", Toast.LENGTH_LONG)
当我们用java开发时,我们的大多数代码是要进行类型检查的,如果我们不想出现unexpected NullPointerException的话,我们就要在运行代码之前持续的检查是否有对象为null。Kotlin,和其它语言一样,是空指针安全的,因为我们可以通过安全的调用操作来准确的声明一个object可以为null。
//This won´t compile. Artist can´t be null var notNullArtist: Artist = null //Artist can be null var artist: Artist? = null // Won´t compile, artist could be null and we need to deal with that artist.print() // Will print only if artist != null artist?.print() // Smart cast. We don´t need to use safe call operator if we previously checked nullity if (artist != null) { artist.print() } // Only use it when we are sure it´s not null. Will throw an exception otherwise. artist!!.print() // Use Elvis operator to give an alternative in case the object is null val name = artist?.name ?: "empty"
val sum = { x: Int, y: Int -> x + y } val three = sum(1, 2) fun apply(i: Int, f: (Int) -> Unit) = f(i)
apply(2, { x -> x + 25 }) //you can omit round brackets if lambda is the last argument apply(2) { x -> x + 25 }
可以用is或者!is来检查类型
if (obj is String) { print(obj.length) } if (obj !is String) { // same as !(obj is String) print("Not a String") }
自动转换
fun demo(x: Any) { if (x is String) { print(x.length) } }
用object定义一个单例或者静方法。
object ApiConfig { val baseUrl: String = "https://github.com" }
open class MyFragment() : Fragment() { class object { fun newInstance(): MyFragment { return MyFragment() } } }
通过Kotlin M11,我们还提供了一个新的插件,这个插件将会帮助我们这个android开发者们用一种更加简单的方法去访问xml下定义的view。
Kotlin Android 扩展组件是一个基本的控件绑定,它将会让你在代码中通过id来使用你在xml中定义的view,它将会在不使用任何注解或者findViewById的方法自动创建这些属性。
使用这个扩展组件,你需要安装一个新的插件,这个插件叫做Kotlin Android Extensions 并且添加通过buildscript来添加这个地址(在项目的build.gradle=中)
dependencies { classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" }
如果你想在你的activity中使用这个view,你唯一需要做得就是导入这个属性或者页面
import kotlinx.android.synthetic.activity_main.*
<TextView android:id="@+id/myMessage" android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" />
public class MainActivity : ActionBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myMessage.setText("123"); } }
你再也不需要去findViewbyId了。
Java有Kotlin无
Kotlin有Java无
kotlin是一个更灵活的语言,拥有了很多java没有的属性,效率虽然不比java,但是慢不了不少。总的来说kotlin也许是未来发展的趋势。
…………………………………………………………………………………………………………………………
也是去年实习写的文章,现在发出来。