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.pswp.cn/news/254519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254519.shtml
英文地址,請注明出處:http://en.pswp.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…