你好,JavaRush 同學,在你完全被 Java 吸引之前,我想拓展你的視野,讓你專注在日益流行的Kotlin語言!
Kotlin 是由JetBrains開發的一種相當年輕的語言。是的,是的,正是這家公司開發了我們最喜歡的 IDE:IntelliJ IDEA。Kotlin 是一種 JVM 語言,與 Java 完全相容,也就是說,從 Kotlin 程式碼中您可以輕鬆存取熟悉的 Java 函式庫。庫呢:Kotlin 和 Java 類別可以共存於一個套件中!Kotlin 在程式設計社群中非常受歡迎,以至於 Google 承認它為 Android 的官方開發語言,最近 Kotlin 也開始在企業專案中受到歡迎。在這篇文章中,我想給出幾個用 Kotlin 和 Java 編寫的程式碼的比較範例,並得出一些結論。去! 像往常一樣,讓我們從“Hello World”開始
// Java
public class Application {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
// Kotlin
class Application
fun main(vararg args: String) {
println("Hello World!")
}
看看 Kotlin 範例,我們可以立即註意到以下幾點:
- 無需在行尾寫分號;
- 所有方法均由fun關鍵字描述;
- 要列印一行,只需一個單字就足夠了 - println()!
// Java (до 10)
final Application application = new Application();
// Kotlin
val application = Application()
科特林差異:
- 如果從實例中可以清楚地看出變數的類型,則無需宣告變數的類型;
- 而非變數類型 - val(不可變)或var(可變);
- 您不需要編寫new關鍵字來建立實例!
// Java
public int sum(int a, int b) {
return (a + b);
}
// Kotlin
fun sum(a: Int, b: Int): Int {
return (a + b)
}
科特林差異:
- 如果方法需要傳回某些內容,則在簽章中加入“ : Int ”,其中Int是傳回類型;
- 方法參數說明:先是變數名,然後是型別;
- 由於方法體僅由一行組成,因此您可以省略return:
fun sum(a: Int, b: Int): Int = (a+b)
// Java
public int sum(int a, int b) {
int result = (a + b);
System.out.printf("Сумма %d и %d равна %d\n", a, b, result);
return result;
}
// Kotlin
fun sum(a: Int, b: Int): Int {
val result = (a + b)
println("Сумма $a и $b равна $result")
return result
}
Kotlin 支援字串插值,只需在變數開頭使用「$」符號即可。這種表示法顯著提高了程式碼的簡潔性和可讀性。 實例對比
// Java
object1.equals(object2)
// Kotlin
object1 == object2
在 Kotlin 中,物件類型的比較「==
」被翻譯為equals
! 為了比較鏈接,===
使用“”。 例外情況
// Java
public List<String> getFileContent(String file) throws IOException {
Path path = Paths.get(file);
return Files.readAllLines(path);
}
// Kotlin
fun getFileContent(file: String): List<String> {
val path = Paths.get(file)
return Files.readAllLines(path)
}
Kotlin 中沒有檢查異常;現在您不需要在整個應用程式中無休止地拋出異常或創建多層級異常try-catch
。 空安全
// Java
public class Data {
String value;
String render() {
if (value == null) {
return "Value: undefined";
} else {
return "Value:" + value.toUpperCase();
}
}
}
// Kotlin
class Data {
var value: String? = null
fun render(): String =
"Value: ${value?.toUpperCase() ?: "undefined"}"
}
Kotlin 解決了 NPE 問題並引入了一些要求:
- 所有類別欄位和變數都必須初始化;
- 您可以在欄位或變數中寫入“null”,但是您必須明確表示您的變數是可為空的(寫入“?”符號);
- Elvis 運算子「?:」的工作原理如下:如果左側為 Null,則取右側的值。在我們的範例中,當value變數未初始化時,將採用值「 undefined 」。
// Java
public class Data {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
class App {
void execute() {
Data data = new Data()
data.setValue("Foo")
}
}
// Kotlin
class Data {
var value: String = ""
}
class App {
fun execute() {
val data = Data()
data.value = "Foo" // Под капотом выполнится data.set("Foo")
}
}
在 Kotlin 中,簡單地描述一個字段就足夠了:它已經有了隱式的 getter 和 setter (hello lombok ),如果需要的話可以隨時重寫。同時,我們只需直接存取該欄位即可讀取和修改該欄位的值,並在幕後呼叫它get()|set()
。 週期
// Java
void example() {
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
for(String line : "a,b,c".split(",")) {
System.out.println(line);
}
}
// Kotlin
fun example() {
for(i in 1..10) {
println(i)
}
for(line in "a,b,c".split(",")) {
println(line)
}
}
Kotlin 為遍歷序列提供了方便且統一的語法:只需在左側使用一個變量,在右側使用一個序列,中間使用關鍵字“ in ”,類型由內容自動確定。 辛格頓
// Java
public class Singleton {
private static Singleton ourInstance = new Singleton();
public static Singleton getInstance() {
return ourInstance;
}
private Singleton() {
}
}
class App {
void execute() {
Singleton singleton = Singleton.getInstance()
}
}
// Kotlin
object Singleton {}
class App {
fun execute() {
val singleton = Singleton
}
}
熟悉的“單例”模式在實踐中經常使用,因此 Kotlin 決定創建一個單獨的關鍵字“ object ”,它代替“ class ”而編寫,意味著該類別是單例;使用時,您甚至不需要需要呼叫構造函數或任何其他方法! 命名方法參數和預設值
// Java
void setStatus(String code) {
setStatus(code, "");
}
void setStatus(String code, String desc) {
this.code = code;
this.desc = desc;
}
// Kotlin
fun setStatus(code: String, desc: String = "") {
this.code = code;
this.desc = desc;
}
fun execute() {
setStatus("200")
setStatus(code = "200", desc = "Ok")
}
碰巧,並非方法或建構函數中的所有參數都必須是必需的,並且在 Java 中,我們習慣於為每種可能的參數組合創建一組方法或建構函數。Kotlin 中引入了預設參數,它允許您聲明 1 個方法,並根據情況向其傳遞所需的參數集。 流
// Java
String getFirst(List<String> strings, String alpha) {
return strings.stream()
.filter(x -> x.startsWith(alpha))
.findFirst()
.orElse("");
}
// Kotlin
fun getFirst(strings: List<String>, alpha: String): String {
return strings.first { it.startsWith(alpha) }
}
Java 8 中流的引入已成為處理集合時不可或缺的功能。在 Kotlin 中,流變得更加方便和實用:每個集合都已經擁有一組方便且常用的資料處理方法。另外,請注意第一個方法內的 lambda 表達式:如果函數文字只有一個參數,則可以刪除其宣告(與 -> 一起),並引用為 it。 是時候結束了…… 我只演示了功能的一小部分,但我確信您已經想嘗試 Kotlin 了!根據我的經驗,我可以得出以下結論:
- 對於 Java 開發人員來說,掌握 Kotlin 語法並開始編寫程式碼非常容易;
- Kotlin 與 Java 完全相容,您已經可以在現有專案中嘗試它,例如在測試中;
- Kotlin 程式碼更乾淨、更具可讀性,你不需要寫一堆樣板檔案;
- IDEA 有一個自動 Java 到 Kotlin 轉換器,您可以將現成的 Java 程式碼自動轉換為 Kotlin;
- 一個新專案需要用Kotlin編寫,因為從基礎設施的角度來看它是相同的Java,但在使用方面它更好,更方便!
GO TO FULL VERSION