首頁 > Java > java教程 > 主體

Java 與 Kotlin基本語法的對比詳解

黄舟
發布: 2017-05-21 10:32:27
原創
1626 人瀏覽過

這篇文章主要介紹了Kotlin 與Java基本語法對比的相關資料,需要的朋友可以參考下

#Kotlin 與Java基本語法對比

Kotlin比Java更年輕,但它是一個非常有前途的程式設計語言,它的社群不斷成長。 每個人都在談論它,並說它很酷。 但為什麼這麼特別?

我們準備了一系列文章,分享我們在Kotlin開發Android應用程式的經驗。 我們將討論Kotlin與Java在語法,可用性,UI效能和非同步性方面的區別,以便您可以決定哪種語言最適合您。

讓我們從一些基本的文法差異開始。 這是第一個:

1. 使用Kotlin,你可以用更少的程式碼做更多

Kotlin的一個主要優點是它的簡潔。 你用更少的程式碼獲得更多的功能。 而你寫的程式碼越少,你犯的錯誤就越少。 這很簡單。 讓

我們來看看Kotlin的基礎知識,從類別開始。

public final class Person {
  private String name;
  private int age;
  private float height;

  public Person(String name, int age, float height) {
    this.name = name;
    this.age = age;
    this.height = height;
  }

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
    this.height = 1.8f;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public float getHeight() {
    return height;
  }

  public void setHeight(float height) {
    this.height = height;
  }

  @Override
  public String toString() {
    return "Person{" +
        "name='" + name + '\'' +
        ", age=" + age +
        ", height=" + height +
        '}';
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Person person = (Person) o;

    if (age != person.age) return false;
    if (Float.compare(person.height, height) != 0) return false;
    return name != null ? name.equals(person.name) : person.name == null
  }

  @Override
  public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + age;
    result = 31 * result + (height != +0.0f ? Float.floatToIntBits(height) : 0);
    return result;
  }  
}
登入後複製

上面是一個通常的Java類別。 它做的不多。 它只包含一些數據。 但是,當你意識到它給錶帶來的不足時,看看這段程式碼有多大是很痛苦的。 為了鼓勵你,我們會給你一個等同的類別寫在Kotlin。

data class Person(var name: String,
         var age: Int,
         var height: Float = 1.8f)
登入後複製

是的,你會為你的資料類別自動取得需要的getters,setters,equals(),hashcode(),toString()和copy()函數! 當然,你可以輕鬆地重寫這些函數,但在大多數情況下,只需聲明類別及其屬性就足夠了。

這正是我們的意思,當我們說Kotlin簡潔。

2. 你可以避免NullPointerException

#現在我們想提醒你在許多程式語言中最大的痛苦- 空指針異常。 我們幾乎不能想像自從托尼·霍爾在1965年發明它之後,有多少開發者遭受了空指針,同時試圖使事情更簡單一些。

可悲的是,我們不能及時回來,防止Tony犯下這個錯誤。 但使用Kotlin,我們現在可以輕鬆地轉義NullPointerException。

val person: Person? = null
...
person?.name = "John"
登入後複製

如果變數是可空的,編譯器將不允許你存取它沒有適當的檢查。 Kotlin強迫你使用? 運算子。 這可以防止應用程式自動崩潰。
它如何在引擎蓋下工作? 讓我們回顧一下產生的字節碼。

L2
LINENUMBER 18 L2
ALOAD 3
DUP
IFNULL L3
LDC "John"
INVOKEVIRTUAL igalata/com/kotlinexample/Person.setName (Ljava/lang/String;)V
GOTO L4
L3
POP
登入後複製

正如你所看到的,我們在這裡有相同的空檢查。 JetBrains的開發人員(建立Kotlin)知道每次檢查我們的變數是避免NullPointerException的唯一方法。 但他們也知道Android開發人員不想在他們的專案中處理NullPointerException。 他們可能想:「為什麼不自動產生這個檢查如果變數是可空的?

JetBrains的開發人員只是這樣,讓我們的生活更容易了!

3. 你可以擺脫util類別

讓我們來討論一下有關使用util類別的醜陋事情。一個聰明的解決方案- 擴充功能- 幫助你擺脫所有的util類別一勞永逸。擴充功能的類別。參數傳遞給makeText()方法?

#

toast("Hi")
登入後複製

你應該記住,擴充函數不以任何方式修改它擴充的類別。 。體中「this」的任何存取都會替換為對第一個參數的存取。
你的util套件!

你还记得findViewById()method()吗? 我们相信你不喜欢它。 我们也不是。 此外,我们不想为我们需要访问的每个视图声明变量和Butterknife注释

你可以忘记与Kotlin Android Extensions的视图绑定。 不再需要创建变量和绑定视图。 您可以使用在xml布局中声明的标识符直接访问您的视图。


public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.button);
    final TextView text = (TextView) findViewById(R.id.text); 
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        text.setText("You've clicked a button");
      }
    });
  }
}

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    super.onCreate(savedInstanceState, persistentState)
    setContentView(R.layout.activity_main)

    button.setOnClickListener { text.text = "You've clicked a button" }
  }
}
登入後複製

这太简单了,不是吗?

基本上,findViewById()方法仍在使用中。 但是没有必要自己写。 Kotlin会为你做。

当您使用Android扩展时,findCachedViewById()函数和HashMap实例将会自动生成。 每次通过其标识符访问您的视图将被一个新的函数调用替换。 如果是第一次访问视图,此函数将调用通常的findViewById()函数,并将接收的视图添加到HashMap中,以便在下次访问视图时从中检索视图。

5. 你可以更容易地使用集合

让我们谈谈Kotlin的集合。 因为我们经常需要使用数据模型集合执行困难的操作。 例如,我们可能有一个学生名单,我们需要从中检索三个A级成绩的学生和两个B成绩的学生。

看看Kotlin的解决方案:


var students = listOf(Student("John", 0), Student("Julia", 2), Student("Matt", 1),
        Student("Katie", 0), Student("Dan", 0))

var firstList = students.filter { it.mark == 0 }.take(3)
var secondList = students.filter { it.mark == 1 }.take(2)
登入後複製

下面是我们如何解决Java中的同样的问题:


ArrayList<Student> students = new ArrayList<Student>() {{
      add(new Student("John", 0));
      add(new Student("Julia", 2));
      add(new Student("Matt", 1));
      add(new Student("Katie", 0));
      add(new Student("Dan", 0));
}};

ArrayList<Student> firstList = new ArrayList<>();
ArrayList<Student> secondList = new ArrayList<>();

for (Student student: students) {
      boolean isFirstFilled = firstList.size() >= 3;
      boolean isSecondFilled = secondList.size() >= 2;

      if (isFirstFilled && isSecondFilled) break;
      int mark = student.getMark();
      if (mark == 0 && !isFirstFilled) {
        firstList.add(student);
      } else if (mark == 1 && !isSecondFilled) {
        secondList.add(student);
      }
    }
登入後複製

这只是一个小例子,说明如何在Kotlin和Java中使用集合,但你可以看到差别! 你能想象如果我们处理一个大项目的集合,Kotlin会有什么区别吗?

以上是Java 與 Kotlin基本語法的對比詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!