Kotlin vs Java on Android

来源:互联网 发布:奥威软件 编辑:程序博客网 时间:2024/06/10 11:16

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 = 10val 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)
}

 

 

publicfun get(index:Int): Int
public funset(index: Int,value: Int): Unit
public funsize(): Int
public funiterator(): IntIterator

 

6)     Object

Class来定义一个类,可以在定义类的时候指明构造方法。可以使用constructor创建辅助构造函数。

class 默认的访问类型是internal和final的,只能在一个包内部访问,可修改的访问类型为public private、protect。如果想让一个类继承,需要用open标注。

open classA (){
   
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 1step 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

这样定义一个类之后,可以有如下的构造方法。

classB(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 nullvar notNullArtist: Artist = null//Artist can be nullvar artist: Artist? = null// Won´t compile, artist could be null and we need to deal with thatartist.print()// Will print only if artist != nullartist?.print()// Smart cast. We don´t need to use safe call operator if we previously checked    nullityif (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 nullval 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 argumentapply(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也许是未来发展的趋势。


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

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


0 0
原创粉丝点击