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也许是未来发展的趋势。
…………………………………………………………………………………………………………………………
也是去年实习写的文章,现在发出来。
- Kotlin vs Java on Android
- Java vs. Kotlin:应该使用Kotlin进行Android开发吗?
- Kotlin on Android FAQ
- android:Kotlin Java Kotlin android Kotlin
- Kotlin on Android. Now official
- Start With Kotlin On Android
- Kotlin and Rxjava on Android
- Kotlin VS Java:基本语法差异
- Kotlin VS Java:基本语法差异
- MVC vs. MVP vs. MVVM on Android
- Kotlin开发Android笔记2:Kotlin与Java简单比较
- Kotlin开发Android笔记2:Kotlin与Java简单比较
- Android从java->kotlin,感受kotlin的神奇之处
- Kotlin VS Swift
- Java?Kotlin?Kotlin!
- Java?Kotlin?Kotlin!
- android项目中,java调用kotlin代码
- android kotlin与 Java 语言比较
- 深入理解HTTP协议
- React Native商城项目实战04 - 封装TabNavigator.Item的创建
- mysql中的锁
- POJ - 3254 Corn Fields (状态压缩 + DFS)
- JDBC连接数据库
- Kotlin vs Java on Android
- 【WEB-INF】WEB-INF是Java的WEB应用的安全目录
- HDU-1159-CommonSubsequence(LCS最长公共子序列)
- spring框架学习(一)
- Ubuntu安装supervisorctl
- grep 和find 命令
- https原理及tomcat配置https方法
- Android ViewUtils注解框架自定义
- Android5.0:Toolbar + DrawerLayout 实现侧滑效果