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无

 

5.   Sum

kotlin是一个更灵活的语言,拥有了很多java没有的属性,效率虽然不比java,但是慢不了不少。总的来说kotlin也许是未来发展的趋势。


…………………………………………………………………………………………………………………………

也是去年实习写的文章,现在发出来。