Kotlin vs Java onAndroid
1. Pre
Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。
按照JetBrains的说法,根据他们多年的Java平台开发经验,他们认为Java编程语言有一定的局限性和问题,而且由于需要向后兼容,它们不可能或很难得到解决。因此,他们创建了Kotlin项目,主要目标是:
· 创建一种兼容Java的语言
· 编译速度至少同Java一样快
· 比Java更安全
· 比Java更简洁
· 比最成熟的竞争者Scala还简单
本文的目的只是简单的介绍Kotlin基本特性,主要介绍Kotlin在Android上的运用以及与java的对比。
2. Basic properties
1) Hello World!
fun main(args: Array<String>) {
println("Hello, world!")
}
kotlin和java一样,一个执行文件有一个入口执行函数main.
2) Function
用fun来定义一个方法,不同的是他可以在方法内部嵌套定义。(高阶函数)
fun foo(s: String): String {
fun localFoo(): Int {
return 42
}
return s + localFoo()
}
还可以直接定义一个方法返回一个简单的式子,这点有点像C++的宏。
fun PI() = 3.14
3) Variables
用var来定义变量,变量类型写在变量名后。
var a:String
Java中8种基本类型对应kotlin中的基本类型名:
4) String
var s="abc"
var s:String="abc"
String类的变量可以用下标访问:s[i],可以使用加号连接两个String。
使用”””符号可以按输入格式打印图案。
var text="""
*
***
*****
***
*
"""
print(text)
还可以这样使用字符串模板:
val i = 10
val s = "i = $i"
5) Array
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
6) Object
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;
}
}
7) Range of expression
val r1 = 1..5
val r2 = 5 downTo 1
val r3 = 5 downTo 1 step 2
8) Data Class
使用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)
9) other
- 使用冒号“:”继承,而不是'extends'。
- 显式使用‘override': 在Java中, 我们可以使用一个注释使我们的代码更清晰,但它不是必要条件. Kotlin将迫使我们使用它.
- 分号可选: 我们不需要在行的结尾处加上分号。如果我们想要也可以加上, 但如果我们不这样做,它就可以节省大量的时间,并使我们的代码整洁。
3. Feture Used in Android
1) Optional parameters with Defaults
这样定义一个类之后,可以有如下的构造方法。
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);
如果不能满足就需要,用辅助构造函数。
2) Extension Methods
们可以给任何类添加新方法。这比我们在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)
3) Safe Nullpoint
当我们用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"
4) Lambdas
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 }
5) Type Checks and Casts
可以用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)
}
}
6) Singletons
用object定义一个单例或者静方法。
object ApiConfig {
val baseUrl: String = "https://github.com"
}
open class MyFragment() : Fragment() {
class object {
fun newInstance(): MyFragment {
return MyFragment()
}
}
}
7) Kotlin Android Extension
通过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了。
4. Vs Java
Java有Kotlin无
- 检查的异常
- 非对象的基本类型
- 静态成员
- 非私有属性
- 类型擦除
- 通配符类型
Kotlin有Java无
- 功能文字 + 内联函数 =高性能自定义控制结构(Function literals + Inline Function = performent custom control structure)
- 空安全(Null-safety)
- 自动转型(Automatic Casts)
- 字符串模板(String Template)
- 属性(Properties)
- 主构造函数(Primary Constructor)
- 混合类型和一流代理(Mixins and First-class delegation)
- 扩展功能(Extension Function)
- 变量和属性类型推断(Type reference for variable and property types)
- 单例(Singleton)
- 声明位置变量及类型预测(Declaration-site variance & Type Projections)
- 模块(Modules)
- 范围表达式(Range expressions)
- 模式匹配(Pattern maching)
- 物化泛型(Reified generics)
- 操作符重载(Operator overloading)
- Class对象(Class objects)
5. Sum
kotlin是一个更灵活的语言,拥有了很多java没有的属性,效率虽然不比java,但是慢不了不少。总的来说kotlin也许是未来发展的趋势。
…………………………………………………………………………………………………………………………
也是去年实习写的文章,现在发出来。