Kotlin中文文档

Kotlin中文文档

Kotlin中文文档
在线调试

在线调试

Kotlin在线调试工具
开发工具

开发工具

Kotlin开发工具IntelliJ IDEA
技术问答

技术问答

Kotlin技术问答与交流专区

【译】Java、Kotlin、RN、Flutter 开发出来的 App 大小,你了解过吗?

Vision 发表了文章 • 0 个评论 • 276 次浏览 • 2018-06-21 14:25 • 来自相关话题

现在开发 App 的方式非常多,原生、ReactNative、Flutter 都是不错的选择。那你有没有关注过,使用不同的方式,编译生成的 Apk ,大小是否会有什么影响呢?本文就以一个最简单的 Hello World App,来看看不同的框架,编译出来的 Apk 大小,有什么区别。当然,本文的环境下是一个最简单的 Apk,其实只能部分说明问题,你觉得呢?
— 承香墨影

移动开发发展至今,已经可以接受很多方式来开发 App,例如基于特定平台的原生开发方式(使用 Java 或者 Kotlin 开发 Android,使用 Objective-C 或者 Swift 开发 iOS);基于 Facebook 提供的 ReactNative;基于 Walmart 的 Electrode Native;基于 Ionic 框架;使用 Unity 开发一些特定的 App,以及最近 Google 发布的 Flutter.io 框架来开发 App。

那你有没有思考过,这些库和框架,是否会对你的 App 大小有所影响?

我们来分别分析以这些方式编写的应用程序的 Apk 文件,这些应用程序非常的简单,只包含顶部的标题和屏幕中心的文本控件(Hello World)。这是一个最低限度的基本 App。

首先对于这个测试,我会创建四个不同版本的 Apk。分别是:Java、Kotlin、React Native 和 Flutter。Android Api Level 均为 27。

然后使用 Android Studio 编译成 Release 包,使用对应的 cli 编译 React Native 和 Flutter。

它们将使用默认的 proguard 配置,最后我们使用 Android Studio 自带的 Analyze APK 分析这些 Apk。

Java(539 KB)

首先使用 Java 来开始这次实验,使用 Java 开发 Android 算是最常规也是最简单的一种方式。正如前面描述的那样,由于我们仅仅使用了 Java 和 Android 框架来创建这个应用程序,所以它将是最小的,唯一的依赖是 Android 支持库,在这里你可以看到它占用了整个 Apk 内相当多的空间。

我们可以通过删除一些依赖库,使用 Activity 而不是 AppCompatActivity 来进一步降低应用程序的大小。

Kotlin(550KB)

接下来,我们使用 Kotlin。如果你使用 Java 编写过很长一段时间的代码,我想 Kotlin 应该会让你眼前一亮。Kotlin 应用程序的 Release 版本,包含了我们在 Java APK 中能看到的所有内容,以及一些基于 Kotlin 的语法糖信息。

React Native(7MB)

如果你有前端(Web)的开发经验,并希望使用 JavaScript 来开发 App,那么 React Native 是一个不错的选择。

如果你希望在已发布的 App 上,进行更快的功能迭代,使用 React Native 也可以让你不必为每个小改动都发布应用市场。

由 React Native 生成的 Release apk 在 classes.dex 文件中有几个类,这些类有 12193 个针对此应用程序的引用方法。

它还在 x86 和 armeabi-v7a 的 lib 目录中添加了一些 so 库。总共添加了大约 6.4 MB 的空间。

Flutter(7.5MB)

由 Flutter 的 cli 生成的 Release 版本的应用程序中,包含 C / C ++ 引擎和 Dart VM,它们构成了 Apk 的几乎所有部分。该应用程序直接使用本机指令集运行,不涉及任何解释器。

本文里介绍的几种编写 App 的方法,都存在优缺点,在实际工作中,应该根据需求选择适合的方式。你还可以混合搭配这些框架,仅仅用它们的优点来开发 App 的部分功能。

例如,如果你想在 iOS 和 Android 应用程序之间共享代码,你可以尝试使用 React Native 创建某些组件,具体操作请查看 React Native 或 Flutter.io 的官方文档,如果你只关注 Android ,并且 Apk 大小是你一个比较重要的指标,你可以使用 Java 或 Kotlin。

本文的数据,其实都是基于一个最简单的 APK,如果是分析 APK 大小的话,其实还有一个很重要的指标没有参考,就是代码量的递增,对 APK 大小的影响。

ReactNative 和 Flutter 因为其内部还需要包含一些解析器和引擎,本身就会有一些基础库在其内,所以变大也是符合预期的。

举个例子:不同城市出租车的起步价不一样,有些城市可能是 14 元起步,有些则是 7 元起步价,但是可能 14 元起步价的后期每公里递增的价钱比 7 元起步价的低。这样在两个城市,开到多少公里之后,总是会有一个平均值,让它们的费用相等。

在这些框架中也是一样,它们只是起步价不一样而已。
 
 
原文链接: https://android.jlelse.eu/comparing-apk-sizes-a0eb37bb36f
http://www.jcodecraeer.com/a/anzhuokaifa/2018/0327/9526.html 查看全部

现在开发 App 的方式非常多,原生、ReactNative、Flutter 都是不错的选择。那你有没有关注过,使用不同的方式,编译生成的 Apk ,大小是否会有什么影响呢?本文就以一个最简单的 Hello World App,来看看不同的框架,编译出来的 Apk 大小,有什么区别。当然,本文的环境下是一个最简单的 Apk,其实只能部分说明问题,你觉得呢?
— 承香墨影

移动开发发展至今,已经可以接受很多方式来开发 App,例如基于特定平台的原生开发方式(使用 Java 或者 Kotlin 开发 Android,使用 Objective-C 或者 Swift 开发 iOS);基于 Facebook 提供的 ReactNative;基于 Walmart 的 Electrode Native;基于 Ionic 框架;使用 Unity 开发一些特定的 App,以及最近 Google 发布的 Flutter.io 框架来开发 App。

那你有没有思考过,这些库和框架,是否会对你的 App 大小有所影响?

我们来分别分析以这些方式编写的应用程序的 Apk 文件,这些应用程序非常的简单,只包含顶部的标题和屏幕中心的文本控件(Hello World)。这是一个最低限度的基本 App。

首先对于这个测试,我会创建四个不同版本的 Apk。分别是:Java、Kotlin、React Native 和 Flutter。Android Api Level 均为 27。

然后使用 Android Studio 编译成 Release 包,使用对应的 cli 编译 React Native 和 Flutter。

它们将使用默认的 proguard 配置,最后我们使用 Android Studio 自带的 Analyze APK 分析这些 Apk。

Java(539 KB)

首先使用 Java 来开始这次实验,使用 Java 开发 Android 算是最常规也是最简单的一种方式。正如前面描述的那样,由于我们仅仅使用了 Java 和 Android 框架来创建这个应用程序,所以它将是最小的,唯一的依赖是 Android 支持库,在这里你可以看到它占用了整个 Apk 内相当多的空间。

我们可以通过删除一些依赖库,使用 Activity 而不是 AppCompatActivity 来进一步降低应用程序的大小。

Kotlin(550KB)

接下来,我们使用 Kotlin。如果你使用 Java 编写过很长一段时间的代码,我想 Kotlin 应该会让你眼前一亮。Kotlin 应用程序的 Release 版本,包含了我们在 Java APK 中能看到的所有内容,以及一些基于 Kotlin 的语法糖信息。

React Native(7MB)

如果你有前端(Web)的开发经验,并希望使用 JavaScript 来开发 App,那么 React Native 是一个不错的选择。

如果你希望在已发布的 App 上,进行更快的功能迭代,使用 React Native 也可以让你不必为每个小改动都发布应用市场。

由 React Native 生成的 Release apk 在 classes.dex 文件中有几个类,这些类有 12193 个针对此应用程序的引用方法。

它还在 x86 和 armeabi-v7a 的 lib 目录中添加了一些 so 库。总共添加了大约 6.4 MB 的空间。

Flutter(7.5MB)

由 Flutter 的 cli 生成的 Release 版本的应用程序中,包含 C / C ++ 引擎和 Dart VM,它们构成了 Apk 的几乎所有部分。该应用程序直接使用本机指令集运行,不涉及任何解释器。

本文里介绍的几种编写 App 的方法,都存在优缺点,在实际工作中,应该根据需求选择适合的方式。你还可以混合搭配这些框架,仅仅用它们的优点来开发 App 的部分功能。

例如,如果你想在 iOS 和 Android 应用程序之间共享代码,你可以尝试使用 React Native 创建某些组件,具体操作请查看 React Native 或 Flutter.io 的官方文档,如果你只关注 Android ,并且 Apk 大小是你一个比较重要的指标,你可以使用 Java 或 Kotlin。

本文的数据,其实都是基于一个最简单的 APK,如果是分析 APK 大小的话,其实还有一个很重要的指标没有参考,就是代码量的递增,对 APK 大小的影响。

ReactNative 和 Flutter 因为其内部还需要包含一些解析器和引擎,本身就会有一些基础库在其内,所以变大也是符合预期的。

举个例子:不同城市出租车的起步价不一样,有些城市可能是 14 元起步,有些则是 7 元起步价,但是可能 14 元起步价的后期每公里递增的价钱比 7 元起步价的低。这样在两个城市,开到多少公里之后,总是会有一个平均值,让它们的费用相等。

在这些框架中也是一样,它们只是起步价不一样而已。
 
 
原文链接: https://android.jlelse.eu/comparing-apk-sizes-a0eb37bb36f
http://www.jcodecraeer.com/a/anzhuokaifa/2018/0327/9526.html

为什么我要改用Kotlin?

admin 发表了文章 • 0 个评论 • 259 次浏览 • 2018-04-03 15:01 • 来自相关话题

写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望。为了趁热打铁,我决定提前三天放出原定本周日Release的文章。希望能及时让大家了解一下Kotlin。

相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享。

在写这篇文章前的一个多月,Flipboard中国的Android项目确定了正式将Kotlin作为项目开发语言,这就意味着新增的代码文件将以Kotlin代码格式出现,而且同时旧的Java代码也将会陆陆续续翻译成Kotlin代码。在使用Kotlin的这段时间,被它的简洁,高效,快捷等等特点震撼,所以有必要写一篇文章来谈一谈Kotlin的特性,如若能取得推广Kotlin的效果则倍感欣慰。 


Kotlin的“简历”

来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)
起源来自JetBrains的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛(Kotlin Island)
一种基于JVM的静态类型编程语言

来自知名的工具开发商JetBrains,也就决定了Kotlin的基因中必然包含实用与高效等特征。那我们接下来看一看Kotlin的特点,当然这也是我改用Kotlin的重要原因。

语法简单,不啰嗦//variables and constants
var currentVersionCode = 1 //变量当前的版本号,类型Int可以根据值推断出来
var currentVersionName : String = "1.0" //显式标明类型
val APPNAME = "droidyue.com" //常量APPNAME 类型(String)可以根据值推断出来

//methods
fun main(args: Array<String>) {
println(args)
}

// class
class MainActivity : AppCompatActivity() {

}

// data class 自动生成getter,setting,hashcode和equals等方法
data class Book(var name: String, val price: Float, var author: String)

//支持默认参数值,减少方法重载
fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) {
Toast.makeText(this, message, duration).show()
}
Kotlin支持类型推断,没有Java那样的啰嗦。另外用var表示变量,val表示常量更加的简洁方法也很简单,连function都缩写成了fun,平添了几分双关之意。类的继承和实现很简单,使用:即可Kotlin每个句子都不需要加分号(;)
 
空指针安全

空指针(NullPointerException或NPE)是我们使用Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,比如这样public void test(String string) {
if (string != null) {
char chars = string.toCharArray();
if (chars.length > 10) {
System.out.println(((Character)chars[10]).hashCode());
}
}
}在Kotlin中空指针异常得到了很好的解决。
在类型上的处理,即在类型后面加上,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上,否则编译无法通过。

如下面的代码就是Kotlin实现空指针安全的一个例子,而且相对Java实现而言,简直是一行代码搞定的。fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}

testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")

//result
null
49
null支持方法扩展
很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。public static void longToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。
Lambda, 高阶函数,Streams API, 函数式编程支持
所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。findViewById(R.id.content).setOnClickListener {
Log.d("MainActivity", "$it was clicked")
}所谓的高阶函数就是
可以接受函数作为参数也可以返回函数作为结果
举一个接受函数作为参数的例子。在Android开发中,我们经常使用SharedPreference来存储数据,如果忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,我们能更好的解决这个问题fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) {
val editor = edit()
f(editor)
editor.apply()
}

//实际调用
PreferenceManager.getDefaultSharedPreferences(this).editor {
it.putBoolean("installed", true)
}当然这上面的例子中我们也同时使用了方法扩展这个特性。

Kotlin支持了Streams API和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合Jsoup,来抓取某个proxy网站的数据,代码更加简单,实现起来也快速。fun parse(url: String): Unit {
Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm")
.first().children()
.filter { "tbody".equals(it.tagName().toLowerCase()) }
.flatMap(Element::children).forEach {
trElement ->
ProxyItem().apply {
trElement.children().forEachIndexed { index, element ->
when (index) {
0 -> {
host = element.text().split(":")[0]
port = element.text().split(":")[1].toInt()
}
1 -> protocol = element.text()
5 -> country = element.text()
}
}
}.let(::println)
}
}字符串模板
无论是Java还是Android开发,我们都会用到字符串拼接,比如进行日志输出等等。在Kotlin中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")与Java交互性好
Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,可以说是无缝连接。这表现在
Kotlin可以自由的引用Java的代码,反之亦然。Kotlin可以现有的全部的Java框架和库Java文件可以很轻松的借助IntelliJ的插件转成kotlin
​Kotlin应用广泛​
 
Kotlin对Android应用开发支持广泛,诸多工具,比如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,当然还有已经存在的很多Java的库都是可以使用的。

除此之外,Kotlin也可以编译成Javascript。最近使用Kotlin写了一段抓取proxy的代码,实现起来非常快捷。甚至比纯JavaScript实现起来要快很多。fun handle(): Unit {
window.onload = {
document.getElementsByClassName("table table-sm").asList().first()
.children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) }
.flatMap { it.children.asList() }.forEach {
var proxyItem = ProxyItem()
it.children.asList().forEachIndexed { index, element ->
when (index) {
0 -> {
proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: ""
proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1
}
1 -> proxyItem.protocol = element.trimedTextContent() ?: ""
5 -> proxyItem.country = element.trimedTextContent() ?: ""
}
}.run {
console.info("proxyItem $proxyItem")
}

}
}
}关于性能
Kotlin的执行效率和Java代码的执行效率理论上一致的。有时候Kotlin可能会显得高一些,比如Kotlin提供了方法的inline设置,可以设置某些高频方法进行inline操作,减少了运行时的进栈出栈和保存状态的开销。

读到这里,是不是想要尝试一下Kotlin呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的Pintereset, Square, Flipboard等公司已经开始应用到生产中。
关于转向Kotlin
其实,我在做决定之前(当时Kotlin还没有被钦定)也曾有过考虑,是不是选择了Kotlin就意味着放弃Java呢,冷静下来想一想,其实并不是那么回事,因为Kotlin与Java语法太相近,以及在Kotlin中无时无刻不在和Java相关的东西打交道,所以这点顾虑不是问题的。

对于个人的项目来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。

而比较难抉择的情况是如果如何让团队转用Kotlin,个人认为团队难以转用的原因有很多,比如学习成本,历史包袱等等。但其实根本原因还是思维方式的问题,歪果仁喜欢用工具来提升开发效率,因为人力成本很高。而国内团队提高效率的办法通常是增加成员。好在Flipboard 美国团队自2015年(可能更早)就引入了Kotlin,因此中国团队这边选用Kotlin也更加顺水推舟。当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。

关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。这就意味着要么直接的技术负责人比较开明要么就是需要有人来不断推介来影响团队。

做个比较现实的比拟,Java就像是一趟从我的家乡保定开往北京西的耗时将近2个小时甚至更长的普通列车,而Kotlin则是那趟仅需40分钟就能到达的高铁。通常的人都会选择高铁,因为它节省了时间和提高了体验。这个时间和体验对应编程中的,我想应该是高效率和高可读性,可维护性的代码。

现在好了,有了Google的支持,Kotlin转Android相信在不久的将来就会全面展开。篡改Python的一句名言“人生苦短,我用Kotlin”,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。
 
转载自:https://blog.csdn.net/androidy ... 57157 查看全部

写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望。为了趁热打铁,我决定提前三天放出原定本周日Release的文章。希望能及时让大家了解一下Kotlin。

相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享。

在写这篇文章前的一个多月,Flipboard中国的Android项目确定了正式将Kotlin作为项目开发语言,这就意味着新增的代码文件将以Kotlin代码格式出现,而且同时旧的Java代码也将会陆陆续续翻译成Kotlin代码。在使用Kotlin的这段时间,被它的简洁,高效,快捷等等特点震撼,所以有必要写一篇文章来谈一谈Kotlin的特性,如若能取得推广Kotlin的效果则倍感欣慰。 


Kotlin的“简历”

来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)
起源来自JetBrains的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛(Kotlin Island)
一种基于JVM的静态类型编程语言

来自知名的工具开发商JetBrains,也就决定了Kotlin的基因中必然包含实用与高效等特征。那我们接下来看一看Kotlin的特点,当然这也是我改用Kotlin的重要原因。

语法简单,不啰嗦
//variables and constants
var currentVersionCode = 1 //变量当前的版本号,类型Int可以根据值推断出来
var currentVersionName : String = "1.0" //显式标明类型
val APPNAME = "droidyue.com" //常量APPNAME 类型(String)可以根据值推断出来

//methods
fun main(args: Array<String>) {
println(args)
}

// class
class MainActivity : AppCompatActivity() {

}

// data class 自动生成getter,setting,hashcode和equals等方法
data class Book(var name: String, val price: Float, var author: String)

//支持默认参数值,减少方法重载
fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) {
Toast.makeText(this, message, duration).show()
}

  • Kotlin支持类型推断,没有Java那样的啰嗦。
  • 另外用var表示变量,val表示常量更加的简洁
  • 方法也很简单,连function都缩写成了fun,平添了几分双关之意。
  • 类的继承和实现很简单,使用:即可
  • Kotlin每个句子都不需要加分号(;)

 
空指针安全

空指针(NullPointerException或NPE)是我们使用Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,比如这样
public void test(String string) {
if (string != null) {
char chars = string.toCharArray();
if (chars.length > 10) {
System.out.println(((Character)chars[10]).hashCode());
}
}
}
在Kotlin中空指针异常得到了很好的解决。
  • 在类型上的处理,即在类型后面加上,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null
  • 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上,否则编译无法通过。


如下面的代码就是Kotlin实现空指针安全的一个例子,而且相对Java实现而言,简直是一行代码搞定的。
fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}

testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")

//result
null
49
null
支持方法扩展
很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。
public static void longToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。
fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")
注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。
Lambda, 高阶函数,Streams API, 函数式编程支持
所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。
findViewById(R.id.content).setOnClickListener {
Log.d("MainActivity", "$it was clicked")
}
所谓的高阶函数就是
  • 可以接受函数作为参数
  • 也可以返回函数作为结果

举一个接受函数作为参数的例子。在Android开发中,我们经常使用SharedPreference来存储数据,如果忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,我们能更好的解决这个问题
fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) {
val editor = edit()
f(editor)
editor.apply()
}

//实际调用
PreferenceManager.getDefaultSharedPreferences(this).editor {
it.putBoolean("installed", true)
}
当然这上面的例子中我们也同时使用了方法扩展这个特性。

Kotlin支持了Streams API和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合Jsoup,来抓取某个proxy网站的数据,代码更加简单,实现起来也快速。
fun parse(url: String): Unit {
Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm")
.first().children()
.filter { "tbody".equals(it.tagName().toLowerCase()) }
.flatMap(Element::children).forEach {
trElement ->
ProxyItem().apply {
trElement.children().forEachIndexed { index, element ->
when (index) {
0 -> {
host = element.text().split(":")[0]
port = element.text().split(":")[1].toInt()
}
1 -> protocol = element.text()
5 -> country = element.text()
}
}
}.let(::println)
}
}
字符串模板
无论是Java还是Android开发,我们都会用到字符串拼接,比如进行日志输出等等。在Kotlin中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成
val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")
与Java交互性好
Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,可以说是无缝连接。这表现在
  • Kotlin可以自由的引用Java的代码,反之亦然。
  • Kotlin可以现有的全部的Java框架和库
  • Java文件可以很轻松的借助IntelliJ的插件转成kotlin

​Kotlin应用广泛​
 
Kotlin对Android应用开发支持广泛,诸多工具,比如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,当然还有已经存在的很多Java的库都是可以使用的。

除此之外,Kotlin也可以编译成Javascript。最近使用Kotlin写了一段抓取proxy的代码,实现起来非常快捷。甚至比纯JavaScript实现起来要快很多。
fun handle(): Unit {
window.onload = {
document.getElementsByClassName("table table-sm").asList().first()
.children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) }
.flatMap { it.children.asList() }.forEach {
var proxyItem = ProxyItem()
it.children.asList().forEachIndexed { index, element ->
when (index) {
0 -> {
proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: ""
proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1
}
1 -> proxyItem.protocol = element.trimedTextContent() ?: ""
5 -> proxyItem.country = element.trimedTextContent() ?: ""
}
}.run {
console.info("proxyItem $proxyItem")
}

}
}
}
关于性能
Kotlin的执行效率和Java代码的执行效率理论上一致的。有时候Kotlin可能会显得高一些,比如Kotlin提供了方法的inline设置,可以设置某些高频方法进行inline操作,减少了运行时的进栈出栈和保存状态的开销。

读到这里,是不是想要尝试一下Kotlin呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的Pintereset, Square, Flipboard等公司已经开始应用到生产中。
关于转向Kotlin
其实,我在做决定之前(当时Kotlin还没有被钦定)也曾有过考虑,是不是选择了Kotlin就意味着放弃Java呢,冷静下来想一想,其实并不是那么回事,因为Kotlin与Java语法太相近,以及在Kotlin中无时无刻不在和Java相关的东西打交道,所以这点顾虑不是问题的。

对于个人的项目来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。

而比较难抉择的情况是如果如何让团队转用Kotlin,个人认为团队难以转用的原因有很多,比如学习成本,历史包袱等等。但其实根本原因还是思维方式的问题,歪果仁喜欢用工具来提升开发效率,因为人力成本很高。而国内团队提高效率的办法通常是增加成员。好在Flipboard 美国团队自2015年(可能更早)就引入了Kotlin,因此中国团队这边选用Kotlin也更加顺水推舟。当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。

关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。这就意味着要么直接的技术负责人比较开明要么就是需要有人来不断推介来影响团队。

做个比较现实的比拟,Java就像是一趟从我的家乡保定开往北京西的耗时将近2个小时甚至更长的普通列车,而Kotlin则是那趟仅需40分钟就能到达的高铁。通常的人都会选择高铁,因为它节省了时间和提高了体验。这个时间和体验对应编程中的,我想应该是高效率和高可读性,可维护性的代码。

现在好了,有了Google的支持,Kotlin转Android相信在不久的将来就会全面展开。篡改Python的一句名言“人生苦短,我用Kotlin”,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。
 
转载自:https://blog.csdn.net/androidy ... 57157

使用Kotlin来开发Android,这些优缺点要考虑

admin 发表了文章 • 2 个评论 • 329 次浏览 • 2017-09-20 10:31 • 来自相关话题

 
Kotlin 语言说来也不是很新:是在 2011 年推出的,但火起来大家都知道是因为前几个月谷歌在 I / O 2017 上宣布它成为 Android 官方支持开发语言。自此之后,现在,Kotlin 开始出现在各个语言榜单之上,而且由于 JetBrains 和 Google 的企业支持基础,正迅速得到应用。

据 Kotlin 官方网站的信息,包括 Atlassian、Pivotal 、Uber、Pinterest、Evernote 等知名技术公司正在积极地将 Kotlin 用于 Android 应用开发。

如果你也正在考虑加入 Kotlin 的阵容,请确保已了解该技术的好处以及可能存在的陷阱。这里有一些关于 Kotlin 编程语言的见解,可供参考。

[使用Kotlin来开发Android,这些优缺点要考虑]

与已经发布 22 年的 Java 相比,Kotlin 有一些明显的改进:

提高团队的生产力

基于 Java 的 Kotlin 消除了其前身的过时和繁琐。语言紧凑、清晰、高效,语法简洁直观。因此,Kotlin 可以显着提高团队效率:编写和部署新代码所需的时间较少。这也有助于提高代码可维护性。

据 Keepsafe 的 Android 开发人员 A. J. Alt 所表示,将 “App Lock” 应用从 Java 转换为 Kotlin ,总代码量减少了 30% 。

与现有代码兼容

Kotlin 的优点之一是其 100% 的 Java 互操作性。该语言适用于 Java 本身,及所有相关工具和框架,提供了丰富的生态系统。这也使得可以选择逐渐迁移到 Kotlin ,或者在同一个项目中同时使用这两种语言。

可维护性

由 JetBrains 构建并支持,Kotlin 为许多 IDE(包括 Android Studio)提供了良好的支持。

更少的错误

通过更紧凑和更清晰的代码库,Kotlin 允许在生产中减少错误,生成更稳定的代码。编译器在编译时检测所有可能的错误,而不是运行时。这使得 Kotlin 成为比 Java 更安全的替代品。

可靠

不同于 Swift ,Kotlin 是一种更成熟的语言。在 2011 年推出后,在最终的 1.0 版本发布之前,经历了多个 Alfa 和 Beta 阶段。最新版本也与以前的版本反向兼容。

然而,在生产过程中使用 Kotlin 之前,仍需要考虑几个“陷阱”:Kotlin 虽然非常接近 Java ,但在许多方面依然不同。因此,想要切换语言的开发者仍然面临着一定的学习曲线。因此,如果你决定将 Android 开发团队迁移到 Kotlin ,则需要对培训和时间进行额外的投资。 一些使用过 Kotlin 的开发者反映编译速度较慢,这是 Kotlin 的主要缺点之一。不过,在不同的测试环境下结果有所不同:在某些情况下,Kotlin 以编译速度击败 Java ,但有时它又比 Java 慢得多。 虽然 Kotlin 正在迅速成长为 Android 开发的首要语言,但目前仍然只有一个小型的开发者社区。这意味着用于学习该语言的资源有限,并且找出在应用开发过程中可能出现的问题的答案会比较困难。例如,在 StackOverflow 上搜索 Kotlin 仅有 3600 个左右的帖子,而 Java 有超过 1,000,000 个。由于 Kotlin 对大多数开发者来说仍然比较新,可能很难找到有经验的专业人士。

Kotlin VS Java:是时候切换语言了吗?

正如前面所说,这个问题很难回答。虽然 Kotlin 在某些方面显然优于 Java ,但仍远未完美。 如果你想尝试 Kotlin ,建议雇用一个专门的开发者,或让你的部分团队成员去尝试这种语言。即使它不会对你的应用的性能或其 UI 带来实际的结果,但也不会对其造成任何伤害。 查看全部

 
Kotlin 语言说来也不是很新:是在 2011 年推出的,但火起来大家都知道是因为前几个月谷歌在 I / O 2017 上宣布它成为 Android 官方支持开发语言。自此之后,现在,Kotlin 开始出现在各个语言榜单之上,而且由于 JetBrains 和 Google 的企业支持基础,正迅速得到应用。

据 Kotlin 官方网站的信息,包括 Atlassian、Pivotal 、Uber、Pinterest、Evernote 等知名技术公司正在积极地将 Kotlin 用于 Android 应用开发。

如果你也正在考虑加入 Kotlin 的阵容,请确保已了解该技术的好处以及可能存在的陷阱。这里有一些关于 Kotlin 编程语言的见解,可供参考。

[使用Kotlin来开发Android,这些优缺点要考虑]

与已经发布 22 年的 Java 相比,Kotlin 有一些明显的改进:

提高团队的生产力

基于 Java 的 Kotlin 消除了其前身的过时和繁琐。语言紧凑、清晰、高效,语法简洁直观。因此,Kotlin 可以显着提高团队效率:编写和部署新代码所需的时间较少。这也有助于提高代码可维护性。

据 Keepsafe 的 Android 开发人员 A. J. Alt 所表示,将 “App Lock” 应用从 Java 转换为 Kotlin ,总代码量减少了 30% 。

与现有代码兼容

Kotlin 的优点之一是其 100% 的 Java 互操作性。该语言适用于 Java 本身,及所有相关工具和框架,提供了丰富的生态系统。这也使得可以选择逐渐迁移到 Kotlin ,或者在同一个项目中同时使用这两种语言。

可维护性

由 JetBrains 构建并支持,Kotlin 为许多 IDE(包括 Android Studio)提供了良好的支持。

更少的错误

通过更紧凑和更清晰的代码库,Kotlin 允许在生产中减少错误,生成更稳定的代码。编译器在编译时检测所有可能的错误,而不是运行时。这使得 Kotlin 成为比 Java 更安全的替代品。

可靠

不同于 Swift ,Kotlin 是一种更成熟的语言。在 2011 年推出后,在最终的 1.0 版本发布之前,经历了多个 Alfa 和 Beta 阶段。最新版本也与以前的版本反向兼容。

然而,在生产过程中使用 Kotlin 之前,仍需要考虑几个“陷阱”:Kotlin 虽然非常接近 Java ,但在许多方面依然不同。因此,想要切换语言的开发者仍然面临着一定的学习曲线。因此,如果你决定将 Android 开发团队迁移到 Kotlin ,则需要对培训和时间进行额外的投资。 一些使用过 Kotlin 的开发者反映编译速度较慢,这是 Kotlin 的主要缺点之一。不过,在不同的测试环境下结果有所不同:在某些情况下,Kotlin 以编译速度击败 Java ,但有时它又比 Java 慢得多。 虽然 Kotlin 正在迅速成长为 Android 开发的首要语言,但目前仍然只有一个小型的开发者社区。这意味着用于学习该语言的资源有限,并且找出在应用开发过程中可能出现的问题的答案会比较困难。例如,在 StackOverflow 上搜索 Kotlin 仅有 3600 个左右的帖子,而 Java 有超过 1,000,000 个。由于 Kotlin 对大多数开发者来说仍然比较新,可能很难找到有经验的专业人士。

Kotlin VS Java:是时候切换语言了吗?

正如前面所说,这个问题很难回答。虽然 Kotlin 在某些方面显然优于 Java ,但仍远未完美。 如果你想尝试 Kotlin ,建议雇用一个专门的开发者,或让你的部分团队成员去尝试这种语言。即使它不会对你的应用的性能或其 UI 带来实际的结果,但也不会对其造成任何伤害。

手把手教你使用Kotlin Native无服务器功能!

admin 发表了文章 • 2 个评论 • 283 次浏览 • 2017-09-20 10:28 • 来自相关话题

手把手教你使用Kotlin Native无服务器功能! 查看全部

Kotlin学习系列(二)

admin 发表了文章 • 0 个评论 • 230 次浏览 • 2017-05-23 21:39 • 来自相关话题

IF表达式
if在kotlin可以当做表达式使用跟java的三元操作符类似:
var max = if( a > b ) a else bif分支可以使用代码块,最后一个表达式是返回值:
var max = if (a > b){
print(a)
a
}else{
print(b)
b
}When表达式
kotlin使用when来替换switch语句,基本特性都跟switch差不多会对列出来的分支进行匹配满足条件的分支会被执行。when可以当做表达式或者语句
如果使用when当前表达式满足条件的分支会当做when的返回值。当when当做语句使用的时候会忽略所有分支的值。when的每个分支也可以是语句块最后一个表达式是这个语句块的值。

用做表达式:
var matchValue = 2
var result = when(matchValue){
1 -> 1
2 -> 2
else ->3
}

println(result)用于语句: matchValue = 3
when(matchValue) {
1 -> println(1)
2 -> println(2)
else -> println(3)
}匹配多少值:
kotlin when(matchValue){ 1,2,3 -> println(matchValue) }使用is与!is:
var isInt = when(matchValue){
is Int -> println(matchValue)
else -> false
}使用in与!in:
kotlin var valueIn = when(matchValue){ in 1..3 -> true else -> false }当when没有提供一个值时它的分支是boolean表达式when会执行为真的分支:
var valueIn = when(matchValue){
in 1..3 -> true
else -> false
}for循环
通过任意提供的迭代器的对象循环(迭代器与java类似):
for (item in collection)
print(item)遍历数组: var types = intArrayOf(1, 2, 3)
for(index in types.indices)
print(index.toString() + " ")

for((index, value ) in types.withIndex())
println("index: $index, value: $value")while循环
跟平常的while使用一样:
var index = 0
while(index < 10)
print(index++)

index = 0
do{
print(index)
}while (index++ < 10)转载自:http://www.cnblogs.com/xwgblog/p/5289823.html 查看全部
IF表达式
if在kotlin可以当做表达式使用跟java的三元操作符类似:
var max =  if( a > b )  a else b
if分支可以使用代码块,最后一个表达式是返回值:
var max = if (a > b){
print(a)
a
}else{
print(b)
b
}
When表达式
kotlin使用when来替换switch语句,基本特性都跟switch差不多会对列出来的分支进行匹配满足条件的分支会被执行。when可以当做表达式或者语句
如果使用when当前表达式满足条件的分支会当做when的返回值。当when当做语句使用的时候会忽略所有分支的值。when的每个分支也可以是语句块最后一个表达式是这个语句块的值。

用做表达式:
    var matchValue = 2
var result = when(matchValue){
1 -> 1
2 -> 2
else ->3
}

println(result)
用于语句:
    matchValue = 3
when(matchValue) {
1 -> println(1)
2 -> println(2)
else -> println(3)
}
匹配多少值:
kotlin when(matchValue){ 1,2,3 -> println(matchValue) }
使用is与!is:
    var isInt = when(matchValue){
is Int -> println(matchValue)
else -> false
}
使用in与!in:
kotlin var valueIn = when(matchValue){ in 1..3 -> true else -> false }
当when没有提供一个值时它的分支是boolean表达式when会执行为真的分支:
    var valueIn = when(matchValue){
in 1..3 -> true
else -> false
}
for循环
通过任意提供的迭代器的对象循环(迭代器与java类似):
for (item in collection)
print(item)
遍历数组:
   var types = intArrayOf(1, 2, 3)
for(index in types.indices)
print(index.toString() + " ")

for((index, value ) in types.withIndex())
println("index: $index, value: $value")
while循环
跟平常的while使用一样:
    var index = 0
while(index < 10)
print(index++)

index = 0
do{
print(index)
}while (index++ < 10)
转载自:http://www.cnblogs.com/xwgblog/p/5289823.html

Kotlin学习系列(一)

admin 发表了文章 • 0 个评论 • 215 次浏览 • 2017-05-23 21:35 • 来自相关话题

基本类型

在Kotlin中任何事物都是对象你可以在任何变量上调用相应的方法或属性。Kotlin的一些内置类型如下:
Number: 包含整形与浮点型Character: 字符(Chat)Boolean: 布尔值String: 字符串Array: 数组

在Kotlin内置的类型个人觉得更加像Java中的一些包装类,如果在学习之前将思维转换成Java包装类的思想我觉得学起来更容易理解一些。当然它们还与Java多少有些不同。

Number类型

Kotlin包含如下number类型:
DoubleFloatLongIntShortByte

怎么样有没有感觉跟Java里面的java.lang.Double、java.lang.Long这些包装类差不多用起来也差不多。还有在Kotlin的数字常量可以用十进制、十六进制、指数形式小数、二进制但是没有八进制。Kotlin中是没有自动向上转型的。//内置数据类型
var d: Double = 64.0
var i: Int = 32
var l: Long = 64
var f: Float = 32.0F
var b: Byte = 8
var s: Short = 16

//数字常量
i = 1 //十进制
i = 0x1 //十六进制
i = 01 //八进制不允许
i = 0b00000 //二进制
d = 1.2E10 //指数形式
f = 1.2E10F

//没有自动向上转换
l = i //Int不能自动转换成Long
d = f //同样Float也不能自动转换不过上面说了Kotlin中任何事物都是对象那么我们可以调用相应的方法来显示转换。var i: Int = 5;
var l: Long = i.toLong();字符类型
字符类型在Kotlin中用Char来表示,它不能直接去应用一个number类型如var ch: Int = 'c'是错误的必需要显示的转换var ch: Int = 'c'.toInt()同样Char也支持转意字符\n、\b、\r等跟Java中的差不多。
 
数组
在Kotlin数组分为基本类型的数组和其他类型数据,基本数组类型是指数组中的元素类型都是基本数据类型如: Int、Long、Floa这些类型的数组在Kotlin中分别用IntArray、LongArray、FloatArray来表示可以通过Kotlin内置的方法来创建<*>ArrayOf(values)里面的*号代表具体的元素类型。 var intArray: IntArray = intArrayOf(1, 3, 4);
var longArray: LongArray = longArrayOf(1L, 2L)其他类型的数组可以使用Array通过传入大小与生成对象的方法来创建数组。var str: Array<String> = Array(5, { index -> index.toString })字符串
字符串用String表示同Java一样是不可变的同样内部也用字符组成,访问内部字符可以通过s和循环来遍历。[i]var hello: String = "HelloWorld"

for(index: Int in 0..hello.length - 1){
println(hello[index])
}

for(ch in hello){
println(ch)
}[/i]字符串可分为能够转意一些特殊字符的字符串和原始的字符串。[i] var text1: String = "Hello\tWorld"
var text2: String = """
Hello\bWorld
"""

println(text1)
println(text2)[/i]在text1中\t会转间成一个制表符但在text2不但\b不会转意且任何内容都会照样输出。原始字符串类似XMl中的CDATA。字符串中可以使用模版,就像Java中的String.format的一样但在Kotlin中使用$号开始后面可以加变量名来替换内容。[i] var name: String = "Kotlin";
var greet: String = "Hi, $name";
println(greet)[/i]学习总结

学习Kotlin时免不了要与Java比较但Kotlin更像类似Swift,看IOS同事写Swift后学习了Kotlin的基本类型后感觉太相似了。说实话还是比较喜欢Java这种强类型的语言也许是用了几年不太适应吧。既然开始了一定要坚持学下去不能落伍。本人水平有限可能免不了手滑一下如有错误烦请指出,会即时更改。
 
转载自:http://www.cnblogs.com/xwgblog/p/5245200.html 查看全部
基本类型

在Kotlin中任何事物都是对象你可以在任何变量上调用相应的方法或属性。Kotlin的一些内置类型如下:
  • Number: 包含整形与浮点型
  • Character: 字符(Chat)
  • Boolean: 布尔值
  • String: 字符串
  • Array: 数组


在Kotlin内置的类型个人觉得更加像Java中的一些包装类,如果在学习之前将思维转换成Java包装类的思想我觉得学起来更容易理解一些。当然它们还与Java多少有些不同。

Number类型

Kotlin包含如下number类型:
  • Double
  • Float
  • Long
  • Int
  • Short
  • Byte


怎么样有没有感觉跟Java里面的java.lang.Double、java.lang.Long这些包装类差不多用起来也差不多。还有在Kotlin的数字常量可以用十进制、十六进制、指数形式小数、二进制但是没有八进制。Kotlin中是没有自动向上转型的。
//内置数据类型
var d: Double = 64.0
var i: Int = 32
var l: Long = 64
var f: Float = 32.0F
var b: Byte = 8
var s: Short = 16

//数字常量
i = 1 //十进制
i = 0x1 //十六进制
i = 01 //八进制不允许
i = 0b00000 //二进制
d = 1.2E10 //指数形式
f = 1.2E10F

//没有自动向上转换
l = i //Int不能自动转换成Long
d = f //同样Float也不能自动转换
不过上面说了Kotlin中任何事物都是对象那么我们可以调用相应的方法来显示转换。
var i: Int = 5;
var l: Long = i.toLong();
字符类型
字符类型在Kotlin中用Char来表示,它不能直接去应用一个number类型如var ch: Int = 'c'是错误的必需要显示的转换var ch: Int = 'c'.toInt()同样Char也支持转意字符\n、\b、\r等跟Java中的差不多。
 
数组
在Kotlin数组分为基本类型的数组和其他类型数据,基本数组类型是指数组中的元素类型都是基本数据类型如: Int、Long、Floa这些类型的数组在Kotlin中分别用IntArray、LongArray、FloatArray来表示可以通过Kotlin内置的方法来创建<*>ArrayOf(values)里面的*号代表具体的元素类型。
    var intArray: IntArray = intArrayOf(1, 3, 4);
var longArray: LongArray = longArrayOf(1L, 2L)
其他类型的数组可以使用Array通过传入大小与生成对象的方法来创建数组。
var str: Array<String> = Array(5, { index -> index.toString })
字符串
字符串用String表示同Java一样是不可变的同样内部也用字符组成,访问内部字符可以通过s和循环来遍历。
[i]var hello: String = "HelloWorld"

for(index: Int in 0..hello.length - 1){
println(hello[index])
}

for(ch in hello){
println(ch)
}[/i]
字符串可分为能够转意一些特殊字符的字符串和原始的字符串。
[i]    var text1: String = "Hello\tWorld"
var text2: String = """
Hello\bWorld
"""

println(text1)
println(text2)[/i]
在text1中\t会转间成一个制表符但在text2不但\b不会转意且任何内容都会照样输出。原始字符串类似XMl中的CDATA。字符串中可以使用模版,就像Java中的String.format的一样但在Kotlin中使用$号开始后面可以加变量名来替换内容。
[i]    var name: String = "Kotlin";
var greet: String = "Hi, $name";
println(greet)[/i]
学习总结

学习Kotlin时免不了要与Java比较但Kotlin更像类似Swift,看IOS同事写Swift后学习了Kotlin的基本类型后感觉太相似了。说实话还是比较喜欢Java这种强类型的语言也许是用了几年不太适应吧。既然开始了一定要坚持学下去不能落伍。本人水平有限可能免不了手滑一下如有错误烦请指出,会即时更改。

 
转载自:http://www.cnblogs.com/xwgblog/p/5245200.html

Kotlin入门简介

回复

admin 发起了问题 • 1 人关注 • 0 个回复 • 537 次浏览 • 2017-05-23 21:31 • 来自相关话题