最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin 與 Java基本語法對比

 更新時間:2017年05月19日 10:33:34   投稿:lqh  
這篇文章主要介紹了Kotlin 與 Java基本語法對比的相關(guān)資料,需要的朋友可以參考下

Kotlin 與 Java基本語法對比

Kotlin比Java更年輕,但它是一個非常有前途的編程語言,它的社區(qū)不斷增長。 每個人都在談論它,并說它很酷。 但為什么這么特別?

我們準備了一系列文章,分享我們在Kotlin開發(fā)Android應用程序的經(jīng)驗。 我們將討論Kotlin與Java在語法,可用性,UI性能和異步性方面的區(qū)別,以便您可以決定哪種語言最適合您。

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

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

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

我們看看Kotlin的基礎(chǔ)知識,從類開始。

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類。 它做的不多。 它只包含一些數(shù)據(jù)。 但是,當你意識到它給表帶來的不足時,看看這段代碼有多大是很痛苦的。 為了鼓勵你,我們會給你一個等同的類寫在Kotlin。

data class Person(var name: String,
         var age: Int,
         var height: Float = 1.8f)

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

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

2. 你可以避免 NullPointerException

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

可悲的是,我們不能及時回來,防止Tony犯這個錯誤。 但是使用Kotlin,我們現(xiàn)在可以輕松地轉(zhuǎn)義NullPointerException。

val person: Person? = null
...
person?.name = "John"

如果變量是可空的,編譯器將不允許你訪問它沒有適當?shù)臋z查。 Kotlin強迫你使用? 運算符。 這可以防止應用程序自動崩潰。
它如何在引擎蓋下工作? 讓我們回顧一下生成的字節(jié)碼。

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的開發(fā)人員(創(chuàng)建Kotlin)知道每次檢查我們的變量是避免NullPointerException的唯一方法。 但他們也知道Android開發(fā)人員不想在他們的項目中處理NullPointerException。 他們可能想:“為什么不自動生成這個檢查如果變量是可空的?

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

3. 你可以擺脫util類

讓我們來討論一下有關(guān)使用util類的丑陋事情。 你有沒有一個項目沒有他們? 我們幾乎不記得這一切。 Kotlin有一個聰明的解決方案 - 擴展功能 - 幫助你擺脫所有的util類一勞永逸。

擴展函數(shù)幾乎是一個通常的Kotlin函數(shù)。 但是當你聲明它,你需要指定的實例將具有擴展功能的類。
fun Context.toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()

注意'this',我們作為參數(shù)傳遞給makeText()方法? 它不是類的一個實例,我們聲明這個函數(shù),而是一個Context實例。 現(xiàn)在你可以直接從你的Activity或任何其他Context實例調(diào)用這個函數(shù)。 例如:

toast("Hi")

你應該記住,擴展函數(shù)不以任何方式修改它擴展的類。 那么它如何工作而不改變原來的類? 讓我們再次看到字節(jié)碼。

public final toast(Landroid/content/Context;Ljava/lang/String;)V
  @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
  @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 1
  L0
  ALOAD 1
  LDC "$receiver"
  INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
  ALOAD 2
  LDC "text"
  INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
  L1
  LINENUMBER 31 L1
  ALOAD 1
  ALOAD 2
  CHECKCAST java/lang/CharSequence
  ICONST_0
  INVOKESTATIC android/widget/Toast.makeText (Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
  INVOKEVIRTUAL android/widget/Toast.show ()V
  L2
  LINENUMBER 32 L2
  RETURN
  L3
  LOCALVARIABLE this Ligalata/com/kotlinexample/MainActivity; L0 L3 0
  LOCALVARIABLE $receiver Landroid/content/Context; L0 L3 1
  LOCALVARIABLE text Ljava/lang/String; L0 L3 2
  MAXSTACK = 3
  MAXLOCALS = 3

哈! 您的函數(shù)隱式接收它作為第一個參數(shù)擴展的類的實例。 因此,在字節(jié)碼中,對函數(shù)體中“this”的任何訪問都將替換為對第一個參數(shù)的訪問。 沒有魔法真的。 您可以在項目的任何位置使用此函數(shù)。

時間刪除你的util包!

4. 你可以忘記視圖綁定

你還記得findViewById()method()嗎? 我們相信你不喜歡它。 我們也不是。 此外,我們不想為我們需要訪問的每個視圖聲明變量和Butterknife注釋。

你可以忘記與Kotlin Android Extensions的視圖綁定。 不再需要創(chuàng)建變量和綁定視圖。 您可以使用在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()函數(shù)和HashMap實例將會自動生成。 每次通過其標識符訪問您的視圖將被一個新的函數(shù)調(diào)用替換。 如果是第一次訪問視圖,此函數(shù)將調(diào)用通常的findViewById()函數(shù),并將接收的視圖添加到HashMap中,以便在下次訪問視圖時從中檢索視圖。

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

讓我們談談Kotlin的集合。 因為我們經(jīng)常需要使用數(shù)據(jù)模型集合執(zhí)行困難的操作。 例如,我們可能有一個學生名單,我們需要從中檢索三個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)

下面是我們?nèi)绾谓鉀QJava中的同樣的問題:

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會有什么區(qū)別嗎?

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Java?Chassis3熔斷機制的改進路程技術(shù)解密

    Java?Chassis3熔斷機制的改進路程技術(shù)解密

    這篇文章主要介紹了Java?Chassis?3技術(shù)解密之熔斷機制的改進路程實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Eureka注冊不上或注冊后IP不對(多網(wǎng)卡的坑及解決)

    Eureka注冊不上或注冊后IP不對(多網(wǎng)卡的坑及解決)

    這篇文章主要介紹了Eureka注冊不上或注冊后IP不對(多網(wǎng)卡的坑及解決),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring?MVC請求轉(zhuǎn)發(fā)與請求重定向的示例詳解

    Spring?MVC請求轉(zhuǎn)發(fā)與請求重定向的示例詳解

    轉(zhuǎn)發(fā)指服務器接收請求后,從一個資源跳轉(zhuǎn)到另一個資源中,請求轉(zhuǎn)發(fā)是一次請求,不會改變?yōu)g覽器的請求地址,這篇文章主要介紹了Spring?MVC請求轉(zhuǎn)發(fā)與請求重定向的相關(guān)知識,需要的朋友可以參考下
    2023-09-09
  • Java Hibernate中使用HQL語句進行數(shù)據(jù)庫查詢的要點解析

    Java Hibernate中使用HQL語句進行數(shù)據(jù)庫查詢的要點解析

    HQL是Hibernate框架中提供的關(guān)系型數(shù)據(jù)庫操作腳本,當然我們也可以使用原生的SQL語句,這里我們來看一下在Java Hibernate中使用HQL語句進行數(shù)據(jù)庫查詢的要點解析:
    2016-06-06
  • 詳解Jackson 使用以及性能介紹

    詳解Jackson 使用以及性能介紹

    這篇文章主要介紹了詳解Jackson 使用以及性能介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 詳解Java正則表達式語法

    詳解Java正則表達式語法

    這篇文章主要介紹了Java正則表達式語法,包括常用正則表達式、匹配驗證-驗證Email是否正確以及字符串中查詢字符或者字符串,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java結(jié)束線程的三種方法及該如何選擇

    Java結(jié)束線程的三種方法及該如何選擇

    這篇文章主要介紹了Java結(jié)束線程的三種方法及該如何選擇,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • RestTemplate如何通過HTTP?Basic?Auth認證示例說明

    RestTemplate如何通過HTTP?Basic?Auth認證示例說明

    這篇文章主要為大家介紹了RestTemplate如何通過HTTP?Basic?Auth認證的示例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Java中關(guān)于子類覆蓋父類的拋出異常問題

    Java中關(guān)于子類覆蓋父類的拋出異常問題

    今天小編就為大家分享一篇關(guān)于Java中關(guān)于子類覆蓋父類的拋出異常問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 簡單解析execute和submit有什么區(qū)別

    簡單解析execute和submit有什么區(qū)別

    這篇文章主要介紹了簡單解析execute和submit有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11

最新評論

天镇县| 孝义市| 云梦县| 封开县| 南川市| 石门县| 峨山| 攀枝花市| 阳西县| 饶阳县| 准格尔旗| 正安县| 蒙山县| 富阳市| 石狮市| 法库县| 昭平县| 宿州市| 雷州市| 北宁市| 项城市| 剑阁县| 阿拉尔市| 应城市| 连平县| 合作市| 中超| 五原县| 星子县| 仙桃市| 兴义市| 金阳县| 平泉县| 甘孜| 弥勒县| 珠海市| 江北区| 天镇县| 同德县| 英吉沙县| 镇原县|