什麼是 Kotlin ?最簡單的回答是 Kotlin 是:前端
Kotlin 由 Jetbrains 開發的一門新的語言。java
提及 Jetbrains 不由讓人肅然起敬,在 Java 和 Android 開發領域這家捷克的公司可謂是無人不知、無人不曉,著名的集成開發工具 IntelliJ IDEA 就是有這家公司開發的產品, Android 開發利器 Android Studio 就是在 IDEA 的基礎之上設計的。啥?你二者都沒接觸過,沒事,JetBrains 家的產品不只僅只有這兩個, Python 開發經常使用的 PyChrom ,前端的同窗的開發利器 WebStrom 等等,基本上從前端到後端、從數據科學到網頁開發、從編程語言到數據庫,一些列神奇的工具都是由 JetBrains 開發的,你說這家公司厲不厲害!!!程序員
那麼這家公司爲何要開發一門新的語言呢?能夠經過 Kotlin 的一些特性來進行了解。數據庫
上圖是 Jetbrains 給出的四個爲何選擇 Kotlin 的緣由。編程
首先是簡潔,這裏能夠經過代碼之間的對比來觀察:後端
Hello World java:安全
package hello;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
複製代碼
Kotlin:機器學習
package hello
fun main() {
println("Hello World")
}
複製代碼
能夠明顯的觀察到 Java 寫一個簡單的 Hello World 須要 7 行代碼,而 Kotlin 只須要 5 行代碼,而且輸出函數也比 Java 簡潔。編程語言
文件逐行讀寫 java:函數
public static List<String> getAllFileLines(String fileName) {
if (fileName == null) {
throw new NullPointerException("參數不可爲空");
}
File file = new File(fileName);
if (!file.exists()) {
throw new IllegalArgumentException("文件路徑錯誤");
}
List<String> allFileLines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(file))){
String line;
while ((line = reader.readLine()) != null) {
allFileLines.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return allFileLines;
}
複製代碼
Kotlin:
fun getAllFileLines(fileName: String): List<String> {
var file: File = File(fileName)
if (!file.exists()) {
throw IllegalArgumentException("文件路徑錯誤")
}
return file.readLines();
}
複製代碼
也許一個簡單的 Hello World 並不能看出二者之間的區別,可是經過上述的一個文件讀寫的例子能夠清楚的看到二者之間的對比, Java 用了 22 行,可是使用 Kotlin 的話只用了 7 行。
Java 中最著名的異常就是 java.lang.NullPointException
了,爲了防止出現空指針異常的狀況有時候不得不在代碼中進行防護式編程:
public String getFristStudentNameFromClassRoom(ClassRoom room) {
if (room == null) {
return "教室不存在";
}
List<Students> students = room.getAllStudents();
if (students == null || students.isEmpty()) {
return "這是一個空教室或者全部的學生都不在教室中"
}
return students.get(0);
}
複製代碼
從上述展現的方法中能夠看到爲了防止空指針異常的狀況不得不在代碼中添加多個 if
判斷,來防止對象爲空時程序出錯。
可是 Kotlin 已經從語法層面解決了這個問題。 Kotlin 在建立對象時有兩種聲明:可空、非空,這是從空值角度的分類,這兩種類型與其餘的類型進行組合,從而在語法層面杜絕空指針異常的問題。
示例:
var str1: String = "this is a str" // 聲明一個不可空的字符串,一次必須爲字符串賦值,不然編譯器會報錯。
var str2: String? = null// 聲明一個可空的字符串,一次能夠暫時賦值爲空。
複製代碼
對於上述的示例方法,就能夠將其參數設置爲不可空類型,這樣就會有效的避免空指針異常的出現。
class ClassRoom {
val students: List<String>
constructor(students: List<String>) {
this.students = students
}
}
fun getFristStudentNameFromClassRoom(room: ClassRoom) = if (room.students.isEmpty()) "學生都不在教室中" else room.students[0]
複製代碼
首先,getFristStudentNameFromClassRoom
的參數是一個不能夠爲空的對象,那麼進入函數的 room
必定是不爲空的,同時在定義 ClassRoom 的時候就聲明瞭 students 不可爲空,所以只須要判斷 room.students
中是否存在學生,經過一個三元表達式就能夠輕鬆的完成。
學習一門新語言的最大的擔心是什麼?
我的認爲主要集中在兩個方面:
價值:
編程語言說白了就是一個工具,既然是工具就必然要有用武之地,可以解決實際的問題,體現語言的價值,這是一門編程語言所必須具備的性質。就拿 Python 來講,其在人工智能、機器學習以及數據分析等領域的突出表現使其成爲如今最值得學習的語言之一。固然這是相互做用的,有了以語言爲基礎的針對某個領域的解決方案後,該領域的相關的問題又會反向的促進語言的發展,有關這點之後有時間在進行詳細的討論。那麼 Kotlin 的價值呢?別急接下來就會談到。
學習:
既然是一門新的語言,那麼學習的過程就是不可避免的,可是若是在開始階段就是地獄級的學習難度,相信這門語言是不會有多少人願意學習的,所以平滑的學習曲線對於一門語言來講也是十分重要的,這並不意味着沒有難度,而是指就行關卡制的遊戲同樣須要按部就班,逐步的提高難度,應對不一樣層次的學習者有着不一樣深度的內容去學習。
那麼 Koltin 在這兩點上作的如何,首先是第一點價值, Kotlin 如今已是開發 Android 的首選語言,獲得了來自 Google 的大力推廣,這個價值應該能夠了吧,可是 kotlin 不只僅於此:
至於第二點,做爲一門依託於 JVM 平臺的語言, Kotlin 實現了與 Java 百分之百的互操做,這意味着 Java 能夠作的事情 Kotlin 均可以作,甚至能夠作的更好,同時也能夠在同一個項目中採用 Kotlin 與 Java 進行混合編程,充分利用二者的優勢。
官方還推出了 Java2Kotlin 轉換器,幫助 Java 程序員更加平滑的向 Kotlin 進行轉變。
關於這一點別忘了 Kotlin 的老東家 JetBrains ,最優秀的 Java 集成開發環境就是出自這家公司之手,而且 jetBrains 作出了一些列很是優秀的產品,對於自家的親兒子,你徹底不用擔憂,IDEA 會是你在學習 Kotlin 的過程當中的一大助力。