Kotlin入门简介

Kotlin的“简历”

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

语法简单,不啰嗦

1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
//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中我们不得不写很多防御性的代码,比如这样

1
2
3
4
5
6 7 8 
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实现而言,简直是一行代码搞定的。

1
2
3
4
5
6 7 8 9 10 11 12 
fun testNullSafeOperator(string: String?) {  System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode()) }  testNullSafeOperator(null) testNullSafeOperator("12345678901") testNullSafeOperator("123")  //result null 49 null 

关于空指针安全的原理,可以参考这篇文章研究学习Kotlin的一些方法

支持方法扩展

很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。

1
2
3
public static void longToast(Context context, String message) {  Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } 

但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。

1
2
3
4
fun Context.longToast(message: String) {  Toast.makeText(this, message, Toast.LENGTH_LONG).show() } applicationContext.longToast("hello world") 

注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。

Lambda, 高阶函数,Streams API, 函数式编程支持

所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。

1
2
3
findViewById(R.id.content).setOnClickListener {  Log.d("MainActivity", "$it was clicked") } 

所谓的高阶函数就是

  • 可以接受函数作为参数
  • 也可以返回函数作为结果

举一个接受函数作为参数的例子。在Android开发中,我们经常使用SharedPreference来存储数据,如果忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,我们能更好的解决这个问题

1
2
3
4
5
6 7 8 9 10 
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网站的数据,代码更加简单,实现起来也快速。

1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
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中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成

1
2
3
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细节:字符串的拼接

与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实现起来要快很多。

1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
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的魅力究竟在哪里

Kotlin的有很多特点,比如简洁,安全实用,开发效率高和提升可读性,更好的函数式编程支持。

1.简洁,Kotlin的代码确实比Java更加简洁,比如类型推断,省去结尾的分号等等,然而这远不能成为我们改用Kotlin的原因。

2.安全,这是Kotlin的一个很重要的特性。Kotlin是空指针安全的,JetBrains做了一件很聪明的事情,它们将运行时才能空指针的检测提前到了编译时,主要方式是增加了Any?这种可为空的类型,使用Kotlin之后,我们程序的空指针会得到明显的改善。

3.实用,高效率。Kotlin的实用具体表现在

  • 引入Object,便于我们更好的应用单例模式
  • 引入data class, 避免了我们手写getter/setter/toString等方法
  • 引入参数默认值和具名参数,避免了不必要的方法重载
  • 支持扩展方法,让我们可以省去好多必须要的代码

4.Kotlin引入了Lambda,Streams API 和函数式编程支持。

  • Lambda表达式可以省去了我们创建很多匿名内部类的代码(注由于目前Kotlin基于JVM6,Lambda表达式在字节码阶段依然会翻译成内部类形式)
  • Streams API 结合Lambda表达式和方法引用,让我们的代码处理一件事情以描述的形式,而不是命令实现的方式。
  • Kotlin支持OOP(面向对象编程)和FP(函数式编程),语言本身并没有限制,给了我们选择的自由,Kotlin对FP的友好支持,便于我们写出更加稳定,易于测试,无副作用的方法和代码

5.可读性 从客观上,Kotlin语法和特性上让代码更加具有描述性而已。但是不得不指出代码可读性主要依赖编写者的编码素质和能力

对我个人而言,高阶函数和方法扩展这两个特点着实真心受用。方法扩展会让我有一种创造感,这是Java种的Util方法所无法比拟的。

 

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

 

refs:

http://droidyue.com/blog/2017/05/18/why-do-i-turn-to-kotlin/
http://droidyue.com/blog/2017/05/21/my-opinion-of-kotlins-becoming-an-official-language-of-android/

转载于:https://www.cnblogs.com/bluestorm/p/6890977.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LaTeX基础一:安装与基本操作

一、安装 1.首先下载texlive2015.iso文件。再在解压的镜像文件中运行install-tl-advanced.bat批处理命令。注意要关闭杀毒软件&#xff0c;否则可能会出现错误。2.可以修改一下安装路径&#xff0c;只要更改一个&#xff0c;其他也随之更改&#xff1a;3.把不要安装的语言包去掉…

Match图像匹配halcon算子,持续更新

目录exhaustive_matchexhaustive_match_mggen_gauss_pyramidmonotonyexhaustive_match 功能&#xff1a;模板和图像的匹配。 exhaustive_match_mg 功能&#xff1a;在一个分辨率塔式结构中匹配模板和图像。 gen_gauss_pyramid 功能&#xff1a;计算一个高斯金字塔。 mono…

c++虚函数的前奏--函数指针与回调

声明函数指针并实现回调程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数&#xff0c;不包括完全依赖于不同语法和语义规则的类成员函数&#xff08;类成员指针将在另文中讨论&#xff09;。 声明函数指针 …

你的微信,到底「连接」多少人?

作为一个技术人&#xff0c;用微信这么多年&#xff0c;也加了不少的好友和技术群。大半个月前&#xff0c;大概是5月初的时候&#xff0c;萌生了这个想法。 前后磕磕绊绊&#xff0c;经过了来美帝出差前期差点饿死、项目紧急期等艰难阶段以及各种自学、温习和设计&#xff0c;…

团队项目第一周总结

团队项目第一周总结 今天是周一&#xff0c;项目的进展周期已经进行了一周&#xff0c;做一个大概的总结吧。 周的工作先是定下团队的项目方向&#xff0c;大家技术程度各有不同&#xff0c;因此想大一统的定下一个有些稍稍的花费时间。定好《基于大数据的日志分析》这个题目后…

电路宽度测量halcon例子

一个halcon处理的例子 目录处理要求&#xff1a;原图&#xff1a;处理程序&#xff1a;处理结果&#xff1a;处理要求&#xff1a; 根据客户给的宽度&#xff0c;计算出电路宽度太窄的为NG 原图&#xff1a; 处理程序&#xff1a; read_image (Image, 1.png) rgb1_to_gray(I…

深入理解C/C++函数指针

函数指针数组的妙用 笔者在开发某软件过程中遇到这样一个问题&#xff0c;前级模块传给我二进制数据&#xff0c;输入参数为 char* buffer和 int length&#xff0c;buffer是数据的首地址&#xff0c;length表示这批数据的长度。数据的特点是&#xff1a;长度不定&#xff0c…

iOS显示性能优化过程讲解

点我跳转原文地址 卡顿的原理 iOS系统界面滑动流畅性的保持主要是依靠CPU和GPU两大处理硬件间通力合作的结果&#xff0c;一个视图的显示需要先经过CPU创建、布局计算、对图片解码、文本绘制&#xff0c;然后CPU将计算的结果交给GPU&#xff0c;GPU可能需要对图形进行变换、合成…

asp.net web api集成微信服务(使用Senparc微信SDK)

/// <summary>/// 微信请求转发控制器/// </summary>[RoutePrefix("weixin")]public class WeixinController : ApiController{#region 创建微信菜单/// <summary>/// 创建微信菜单/// </summary>/// <returns></returns>[HttpP…

1.SoapUI接口测试--创建项目

1、点击File-->New soapUI Project 2、填写项目名称&#xff0c;接口服务地址后单击【OK】按钮后就成功创建了一个项目 3、模拟发送请求 4、创建请求 或者直接Copy一个请求 5、保存项目 6、项目是以xml的格式保存的&#xff0c;下次用的时候可以直接导入&#xff0c;点击Fil…

Misc混合halcon算子,持续更新

目录convol_imageexpand_domain_graygray_insidegray_skeletonlut_transsymmetrytopographic_sketchdeviation_nconvol_image 功能&#xff1a;用一个任意滤波掩码对一个图像卷积。 expand_domain_gray 功能&#xff1a;扩大图像区域并且在扩大的区域中设置灰度值。 gray_i…

C/C++ 函数指针调用函数

01//C/C 函数指针调用函数 02#include<iostream> 03using namespace std; 04 05void site1() 06{ 07 cout<<"www.ok2002.com"<<endl; 08} 09 10void site2() 11{ 12 cout<<"www.ok1700.com"<<endl; 13} 14 15void…

汉字编码

汉字编码 一、汉字所占的字节数 对于一个字符串sizeof("请放手")&#xff0c;结果值是4。测试操作系统&#xff1a;Centos 6.4&#xff0c;硬件平台&#xff1a;Windows 7 32位 VirtualBox 4.3.12。看来用sizeof()来计算汉字所占用的字节或空间是不准确的。strlen(&…

Noise噪音halcon算子,持续更新

目录add_noise_distributionadd_noise_whitegauss_distributionnoise_distribution_meansp_distributionadd_noise_distribution 功能&#xff1a;向一个图像添加噪声。 add_noise_white 功能&#xff1a;向一个图像添加噪声。 gauss_distribution 功能&#xff1a;产生一…

sublime text3 package control 报错

安装sublime text3之后&#xff0c;安装package control 报错&#xff0c;错误信息&#xff1a;There are no packages available for installation 根据提示&#xff0c;找到错误解决办法&#xff1a;https://packagecontrol.io/doc... 其实意思就是你的电脑代理出了问题&…

HTML图片元素(标记)

<html> <head> <title>第一个网页</title> </head> <body> ***************图片元素******************</br> <img srcmm.jpg /> </body> </html> 新建一个文件夹“text”,在text文件夹内新建index.html并放入一张…

Optical-Flow光流halcon算子,持续更新

目录optical_flow_mgunwarp_image_vector_fieldvector_field_lengthderivate_vector_fieldoptical_flow_mg 功能&#xff1a;计算两个图像之间的光流。 unwarp_image_vector_field 功能&#xff1a;使用一个矢量场来展开一个图像。 vector_field_length 功能&#xff1a;计…

Oracle中procedure和function创建举例

Procedure创建与执行&#xff1a;Case1&#xff1a; create or replace procedure procedure_name(id user.table_name.columne_name%type)is begin delete from user.table_name where columne_nameid;exception when others then dbms_output.put_line(errors);end&#xff1…

Liunx 中tr的用法

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中cat /etc/issue |tr a-z A-Z > /tmp/issue.out2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中who | tr a-z A-Z >> who.out3、一个linux用户给root发邮件&#xff0c;要who求邮…

ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)

主要更新&#xff1a; 1&#xff1a;升级处理机制&#xff08;js请求由同步变更为异步&#xff09; 2&#xff1a;优化前端JS&#xff1a;包括API和配置方式。 3&#xff1a;增加InputDialog功能。 4&#xff1a;增远远程验证功能。 5&#xff1a;优化权限安全机制。 6&#xf…