2017年6月20日 星期二

[Kotlin] 學習筆記(2) - Basic Concept

在開始之前,附上一篇文章 17位Google Android 工程師對 Kotlin 的看法

來了解一下各方對 Kotlin 的見解

然後也提供一下學習資源 : Kotlin官方文檔

本篇大部分內容都是參考 Kotlin 的官方文檔來的,可以去該網站多挖挖寶

以下開始一些基礎介紹
  • Variables
有兩個關鍵字,val 和 var。val 就是 java 裡的 final,var 是可以重新賦值的變數

var 也有上面的宣告方式,差別在於 var 可以重新賦值

在 Kotlin,變數預設是 non-null type,也就是不能是 null

Kotlin 的一大特色就是能盡量減少 NullPointerException 發生的機率

以下是關於變數 null safety 的介紹
型態轉換也有 null safety 可以使用
如果今天有一個 class 的 property,我們不希望為 null,但也不想在 construtor 去初始化,該怎麼做呢?
lateinit 的用法有一些限制
(1) 只能用在 var 變數
(2) 不能用在 primitive type (Int, Float, ...) 
(3) 該變數不能有客製化的 setter 和 getter
  • Functions
有兩個 Int 的 parameters,回傳 type 是 Int
如果沒有 return value,用 Unit 表示,也可以把 Unit 省略
如果一個函式的參數比較多,這時候可以使用 named arguments 來增加可讀性
function 也可以使用 variable number of arguments

使用 vararg 有幾點注意事項
  1. function 只能有一個 parameter 被標示為 vararg
  2. vararg parameter 通常要放在 parameter list 的最後一個。如果不是最後一個,則在使用的時候,必須搭配 named argument 來使用
  • Class
在 Kotlin,如果 class 沒有指明父類別的話,都會是從 Any 這個例別衍生出來的

class 的基本宣告方式如下
Kotlin 有個和 Java 不一樣的地方是,Kotlin 沒有 new 這個 keyword
每個 class 都會有一個 primary constructor
primary constructor 是不能寫 code 的,必須使用 initializer block 來達到這個目的
Kotlin 還有提供 secondary constructor,一個 class 可以有多個 secondary constructor
在 Kotlin,function 和 constructor 的 arguments 都可以有 default value,這可以簡化原本 Java 的寫法
在繼承 class 的時候,constructor 的寫法有下列兩種情況
以下示範 derived class 如何複寫 function
當 derived class 繼承或實現多個 base class or interface 的情況呢
可以看到因為有 doAction() 的 supertype 不只一個,所以在 Derived class 就一定得用 override 去複寫這個函式

而在這種情況下,要指定使用哪個 supertype 的 doAction(),就可以使用 super<BaseName> 來指定

至於 showMsg() 和 power(),因為來源都只有一個,所以不會被強迫要求用 override 複寫

  • What's Next
本篇介紹一些 Kotlin 基礎的語法,可以看出來 Kotlin 有簡化一些 Java 語法,並且引入一些新的概念

不過也可以看出來,Kotlin 在某些部分也有一些限制,像是為了 null safety,programmer 必須在寫 code 的時候遵從一些語法才行

下一篇會繼續介紹 Kotlin 的基礎語法,讓各位更熟悉 Kotlin

2017年6月16日 星期五

[LeetCode] 523. Continuous Subarray Sum

轉自LeetCode

Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size at least 2 that sums up to the multiple of k, that is, sums up to n*k where n is also an integer.
Example 1:
Input: [23, 2, 4, 6, 7],  k=6
Output: True
Explanation: Because [2, 4] is a continuous subarray of size 2 and sums up to 6.
Example 2:
Input: [23, 2, 6, 4, 7],  k=6
Output: True
Explanation: Because [23, 2, 6, 4, 7] is an continuous subarray of size 5 and sums up to 42.
Note:
  1. The length of the array won't exceed 10,000.
  2. You may assume the sum of all the numbers is in the range of a signed 32-bit integer.
<Solution>

2017年6月15日 星期四

[LeetCode] 560. Subarray Sum Equals K

轉自LeetCode

Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
Example 1:
Input:nums = [1,1,1], k = 2
Output: 2
Note:
  1. The length of the array is in range [1, 20,000].
  2. The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].
<Solution>

2017年6月12日 星期一

[Kotlin] 學習筆記 (1) - Hello Kotlin

在 Google I/O 2017 的大會上

Google 正式宣布 Android Studio 3.0 將會正式支援 Kotlin

這也讓 Kotlin 成為目前熱烈討論的程式語言之一

和 Java 一樣,Kotlin 也是一個 JVM 的語言,由 JetBrains 所開發

因此,Kotlin 和 Java 是可以同時並存一起使用的

至於 Kotlin 會不會取代 Java,以及 Kotlin 和 Java 誰比較好的問題

在這邊就不多作討論,因為這是滿主觀的問題

所以在這邊主要會介紹,怎麼運用 Kotlin 在 Android APP 的開發上

  • 安裝 Kotlin plugin
因為目前 Android Studio 3.0 還沒有正式釋出,所以目前還是得透過安裝 plugin 的方式來使用 Kotlin

到 Preference 下的 plugin 頁面來安裝 Kotlin plugin




  • Hello Kotlin App
接下來寫一個簡單的 App

先看原本 Java 的寫法



接下來看怎麼用 Kotlin 改寫

首先,先設置好 Kotlin,按下 cmd + shift + a,搜尋 kotlin,選擇 configure kotlin in project


Kotlin 寫法



<ps> 在一開始不知道怎麼寫 kotlin 的時候,也可以用 cmd + shift + a -> Convert Java File to Kotlin File 來看怎麼寫

整體來看,好像沒有差別很大,也沒有變得比較簡潔

比較有差別的地方是,可以不用使用 setText(),而變成直接用 property 的方式來設定 text

其實 Kotlin 還有更簡潔的寫法(資料來源)

在 module 的 build.grandle 裡面,加入下面這段 code

apply plugin: 'kotlin-android-extensions'

這時候可以進一步改寫成


不用再使用 findViewById 來找到 TextView,可以直接使用 ID 來存取該 TextView

  • 下一步
這次先簡單介紹一下 Kotlin,之後會再陸續介紹 Kotlin 的各種語法