Overview lại một vài điểm khác biệt của Kotlin so với Java

I.Visibility Modifiers

Trong Kotlin có bốn loại Visibility Modifiers bao gồm public, private, protected và internal. Mặc định không viết gì thì được hiểu là internal. Điều nãy có đôi chút khác biệt với Java là thay vì cứ lúc nào cũng phải gõ public thì nay mặc định không gõ gì đã ra public rồi.

  • public: là dạng có thể được truy cập từ mọi nơi.
  • private: chỉ cho phép truy cập trong module hiện tại.
  • protected: chỉ cho phép truy cập phía bên trong class được khai báo và các derived class.
  • internal: chỉ cho phép truy cập phía bên trong class được khai báo.

II.Type aliases

Một điều tiên quyết cần phải nhớ trong Kotlin là mọi thứ đều là Object. Mà object thì phải có tên. Type aliases là hành vi đặt tên cho một type kiểu Function hoặc kiểu Generic.

typealias StringValidator = (String) -> Boolean
typealias Reductor<T, U, V> = (T, U) -> V
typealias Parents = Pair<Person, Person> typealias Accounts = List
class A {
   inner class Inner
}
class B {
   inner class Inner
}

typealias AInner = A.Inner
typealias BInner = B.Inner
typealias Predicate = (T) -> Boolean

fun foo(p: Predicate) = p(42)

fun main(args: Array) {
    val f: (Int) -> Boolean = { it > 0 }
    println(foo(f)) // prints "true"

    val p: Predicate = { it > 0 }
    println(listOf(1, -2).filter(p)) // prints "[1]"
}

 

III.Strings

3.1. Type of Strings

String trong Kotlin có hai dạng là dạng Escaped string và Raw string. Ở dạng Escaped string sẽ khai báo như bình thường và các kí tự đặc biệt sẽ đi sau kí tự <span style="color:#ff00ff;">\</span>. Các kí tự được hỗ trợ bao gồm:

  • `\n`: Kí tự xuống dòng
  • `\r`: Kí tự kết thúc dòng trong Linux
  • `\t`: Kí tự tab (tab size phụ thuộc vào cài đặt của hệ điều hành)
  • `\b`: Kí tự backspace dùng để xóa kí tự ngay trước dấu nháy.
  • `\\`: Kí tự `\`
  • `\’`: Kí tự ``
  • `\”`: Kí tự ``
  • `\$`: Kí tự `$`
  • `\uxxxx`: Kí tự đại diện bảng mã unicode theo sau là 4 kí tự hex

Còn ở Raw string thì chuỗi sẽ được khai báo đươi dạng “”” giống như python. Toàn bộ nội dung bên trong cặp dấu sẽ được giữ nguyên.

val text = """
for (c in "foo")
print(c)
"""

3.2. Elements of String

Để truy cập vào các phần tử của String, ta truy cập giống hệt như các phần tử của mảng thông thường.

val str = "Hello, World!"
println(str[1]) // Print e

Ngoài ra cũng có thể duyện String theo dạng for-loop.

for (c in str) {
println(c)
}

3.3. String Equality

Trong Kotlin mọi thứ đều là object. Để tránh phải dùng equal() quá nhiều. Có hai kiểu so sánh trong Kotlin bao gồm so sánh <span style="color:#ff00ff;">==</span> và so sánh <span style="color:#ff00ff;">===</span> tương tự như Javascript tuy nhiên vẫn có một vài khác biệt.

<span style="color:#ff00ff;">==</span> là so sánh giá trị của hai toán tử. Lưu ý là không thể so sánh được giá trị của hai toán hạng khác kiểu.

val str1 = "Hello, World!"
val str2 = "Hello," + " World!"
println(str1 == str2) // Prints true

<span style="color:#ff00ff;">===</span> là so sánh tham chiếu của hai toán tử.

val str1 = """
|Hello, World!
""".trimMargin()

val str2 = """
#Hello, World!
""".trimMargin("#")

val str3 = str1

println(str1 == str2) // Prints true
println(str1 === str2) // Prints false
println(str1 === str3) // Prints true

 

3.4. String Templates

Kotlin cũng đồng thời hỗ trợ string templates trong chuỗi String thay vì phải sử dụng string format như sau.

val i = 10
val s = "i = $i" // evaluates to "i = 10"

val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"

Một lưu ý là khi sử dụng cặp dấu {} cũng cho phép ta chèn kí tự ngay liền sau biểu thức:

val i = 10
val s = "i = $i0" // error
val s = "i = ${i}0" // evaluates to "i = 100"

IV. Arrays

Array không được khai báo trực tiếp như trong Java nữa mà được khai báo thông qua dạng Generic Arrays <span style="color:#ff00ff;">Array</span>

val empty = emptyArray()

Để khởi tạo một arrays với kích thước cho trước cùng giá trị khởi tạo, ta dùng phương thức:

var strings = Array(size = 5, init = { index -> "Item #$index" })
print(Arrays.toString(a)) // prints "[Item #0, Item #1, Item #2, Item #3, Item #4]"
print(a.size) // prints 5

Một arrays trong Kotlin có hai cách để lấy giá trị bao gồm thông qua set/get hoặc thông qua index.

strings.set(2, "ChangedItem")
print(strings.get(2)) // prints "ChangedItem"

// You can use subscription as well:
strings[2] = "ChangedItem"
print(strings[2]) // prints "ChangedItem"

 

Kiểu dữ liệu nguyên thủy của Java cũ thì không được kế thừa lại Array nhằm hạn chế việc boxing.

Kotlin type     Factory function              JVM type
BooleanArray    booleanArrayOf(true, false)   boolean[]
ByteArray       byteArrayOf(1, 2, 3)          byte[]
CharArray       charArrayOf('a', 'b', 'c')    char[]
DoubleArray     doubleArrayOf(1.2, 5.0)       double[]
FloatArray      floatArrayOf(1.2, 5.0)        float[]
IntArray        intArrayOf(1, 2, 3)           int[]
LongArray       longArrayOf(1, 2, 3)          long[]
ShortArray      shortArrayOf(1, 2, 3)         short[]

V. Vararg Parameters in Functions

Một khái niệm rất quen thuộc với Java dưới dạng dấu … trong khai báo phương thức. Vararg được sử dụng trong khai báo phương thức nhằm báo hiệu một số lượng không xác định parameter được chấp nhận.

public void method(String... a);

Trong Kotlin, khái niệm này được thể hiện bằng từ khóa <span style="color:#ff00ff;">vararg</span>.

fun printNumbers(vararg numbers: Int) {
for (number in numbers) {
println(number)
}
}

printNumbers(0, 1) // Prints "0" "1"
printNumbers(10, 20, 30, 500) // Prints "10" "20" "30" "500"

 

Lưu ý rằng một vararg parameter phải được khai báo là phần từ duy nhất và cuối cùng trong method.

Đi kèm với từ khóa vararg là khái niệm về toán tử spread <span style="color:#ff00ff;">*</span> được đặt ở trước một array trong phương thức để gọi <span style="color:#ff00ff;">unfold</span> nội dung của array đó thành một danh sách các parameter độc lập.

VI. Null safety

6.1. Nullable and Non-Nullable types

Các kiểu dữ liệu trong Kotlin thì mặc định không có null. Tuy nhiên trong một vài trường hợp thì null không thể thiếu được (ví dụ như định nghĩa một cấu trúc giữ liệu). Bạn có thể cho phép biến số của mình có thể null bằng các thêm dấu <span style="color:#ff00ff;">?</span> vào khai báo.

var string : String = "Hello World!"
var nullableString: String? = null

string = nullableString // Compiler error: Can't assign nullable to non-nullable type.
nullableString = string // This will work however!

6.2. Assertion

<span style="color:#ff00ff;">!!</span> là hậu tố dùng để ngăn chặn việc sử dụng giá trị null cho dữ liệu. Một KotlinNullPointerException sẽ được trả ra khi mà object là null. Điều này không thấy có cái ý nghĩa gì cả.

val message: String? = null
println(message!!) //KotlinNullPointerException thrown, app crashes

6.3. Smart cast

Nếu một object được compiler cho là có thể gây ra lỗi null, bạn sẽ bị yêu cầu thực hiện check null trước thời điểm sử dụng object đó. Cũng hãy lưu ý rằng là compiler không cho phép bạn thực hiện smart cast một mutable variables vì chúng có thể bị thay đổi giá trị trong khoảng thời gian sau khi check null và trước khi sử dụng. Để khắc phục điều này thì bạn cần làm là nếu có bất kì biến nào được truy cập từ phía bên ngoài phạm vi của block hiện tại thì bạn cần tạo mới một tham chiếu local.

var string: String? = "Hello!"
print(string.length) // Compile error
if(string != null) {
// The compiler now knows that string can't be null
print(string.length) // It works now!
}

6.4. Eliminate nulls from an Iterable and array

Kotlin cũng hỗ trợ sẵn trong collection cơ bản phương thức để chuyển từ <span style="color:#ff00ff;">Collection&lt;T?&gt;</span> thành <span style="color:#ff00ff;">Collection</span>.

val a: List<Int?> = listOf(1, 2, 3, null)
val b: List = a.filterNotNull()

6.5. Null Coalescing / Elvis Operator (?:)

Một điểm nữa cũng rất mạnh của Kotlin khi thực hiện kĩ thuật cho phép bạn lựa chọn giá trị mặc định thay thế null gọi là Null Coalescing.

val value: String = data?.first() ?: "Nothing here."

Đoạn code trên sẽ trả về dữ liệu là “Nothing here.” nếu trong trường hợp data?.first() hoặc data bị null. Trong trường hợp còn lại. Kết quả của biểu thức data?.first() sẽ được trả về.

Ngoài ra thì bạn cũng có thể bắn ra một Exception theo hai cách.

val value: String = data?.second() ?: throw IllegalArgumentException("Value can't be null!")
val value: String = data!!.second()!!

6.6. Safe call operator

Để sử dụng một phương thức có thể bị null, Kotlin cung cấp một dạng safe call operator.

val string: String? = "Hello World!"
print(string.length) // Compile error: Can't directly access property of nullable type.
print(string?.length) // Will print the string's length, or "null" if the string is null.

Còn một vài điểm đáng chú ý nữa của Kotlin sẽ nằm trong các loạt bài viết sau. Bài viết không có giá trị học thuật chỉ có giá trị tham khảo cái nhìn tổng quan nhằm liệt kê lại các kiến thức đã học như một cách nhớ lại của tác giả.

Advertisements

Kotlin, ngôn ngữ thực dụng dành cho Android

I.Kotlin là gì?

Như các bạn đã biết thì cách đây không lâu Apple đã cho ra đời một ngôn ngữ mới chạy song song với ObjectiveC. Trong khi đó thì Android vẫn đang bị tắc nghẽn lại với Java, một ngôn ngữ lâu đời thiếu vắng đi rất nhiều chức năng hiện đại như Lambdas, properties hay higher-order functions (Java có lambdas cũng chỉ như một hình thức vá víu trên nền OOP không hiệu quả). Và đó là điều kiện để Kotlin xuất hiện. Kotlin là một ngôn ngữ được đặt tên theo một hòn đảo tại Petersburg được phát triển bởi JetBrains – đơn vị phát hành IDE cho Android. Kotlin là open source được viết dựa trên JVM phù hợp với Java cũng như là bản nâng cấp hiện đại hơn Java.

Hình thành và phát triển từ tháng 7 năm 2011. Release lần đầu vào tháng 2 năm 2016. Kotlin trở thành một ngôn ngữ họ lai giữa Object Oriented Programming và Functional Programming vượt qua rất nhiều bài test về hiệu năng và thể hiện sự nổi bật của mình so với thế hệ đàn anh. Và mới đây thôi, Kotlin đã được chính thức thông báo trở thành ngôn ngữ chính thức của Android được hỗ trợ bởi Google trong sự kiện Google IO 2017.

Vậy Kotlin có gì? Continue reading

Từ tiếng Nhật thường dùng để chỉ các bộ phận của một thiết bị mobile

Khi phải làm việc với các thiết bị mobile thì nhiều lúc không biết phải gọi tên chúng trong tiếng Nhật như thế nào. Thật khó để nói lời yêu thương.

Nút nguồn

Exif_JPEG_PICTURE

オン/オフボタン、スリープ/スリープ解除 ボタン

Rắc cắm tai nghe

Exif_JPEG_PICTURE

イヤフォンジャック

Microphone

Exif_JPEG_PICTURE

ノイズキャンセル用マイク

Dock sạc 30 chân

Exif_JPEG_PICTURE

30ピンDockコネクタ

Loa trong

内蔵スピーカー

Phím tắt chuyển âm thanh

サウンドオン/オフ

Phím âm lượng

音量調整ボタン

Khe Sim

SIMトレイ

Loa trong

通話時スピーカー

Camera trước

フロントカメラ

Cảm biến ánh sáng và cảm biến tiệm cận

環境光センサー、近接センサー

Camera sau

リアカメラ

Phím home

ホームボタン

[Trải nghiệm Nhật của bạn Tâm Nin]Các thủ tục hành chính sau khi qua Nhật

Trong chuyến đi cong tác lần này thật sự là có khá nhiều trải nghiệm thú vị về Nhật Bản muốn được chia sẻ cùng các bạn trong chuỗi seri Trải nghiệm Nhật Bản của Tâm Nin. Tuy nhiên thời gian eo hẹp. Ngày nào cũng phải học tiếng Nhật và resolve các scient paper nên không còn đủ thời gian làm việc riêng nữa. Lần này rảnh rảnh dự án nên mình muốn chia sẻ với các bạn một tài liệu khá hữu ích khi bắt đầu cuộc sống ở Nhật. Note lại để bản thân khi cần cũng có thể tự tra cứu luôn. Khi các bạn qua tới  Nhật, việc đầu tiên là bạn phải quyết định nơi ở. Sau đó, những bước dưới đây là những điều cần lưu ý khi sống và làm việc tại Nhật: Continue reading

[Trải nghiệm Nhật Bản của bạn Tâm Nin]Tàu điện – phương tiện giao thông phổ biến nhất Nhật Bản

Việc làm đầu tiên của bạn Tâm Nin sau khi ổn định cuộc sống chính là tót đi chơi theo lời anh Sơn Phạm tư vấn lúc ở nhà. Quỹ một man trải nghiệm Nhật Bản thay vì một tháng một lần làm một chuyến to thì lúc mới sang nên chia nhỏ ra thành tháng bốn cuối tuần sẽ hợp lí hơn. Việc đi chơi mạnh hay yếu tùy thuộc vào khả năng sử dụng tàu điện của bạn.
Với vốn tiếng Nhật ngấp nghé N5 của mình thì cũng cố gắng vẫn dùng được tàu điện mặc dù hơi khó khăn. Ở bên này thì tiếng Anh chẳng để làm gì cả. Hỏi từ người già đến người trẻ chẳng ai hiểu. Nên nếu tiếng Nhật của bạn mà mạnh thì hãy bạt mạng đi. 😦 Đùa đấy. Vẫn theo tinh thần của anh Sơn Tô thì ở nơi đất khách này vừa chân ướt chân ráo mà gặp vấn đề gì thì sẽ rất là rắc rối. Một nhân viên tốt là người sẽ không làm phiền người khác. Vậy nên hãy cùng mình trải nghiệm phương tiện công cộng phổ biến nhất tại Nhật này nhé.

Continue reading