Kotlin function
1. Định nghĩa Function
Function ở trong Kotlin được định nghĩa bằng từ khóa fun
Java
Kotlin
Tên function:
doSomething
Khai báo parameter truyền vào function:
<tên param> : <type param>
Return type của function là
String
:func <tên function>(): <return type> {//body}
Single-Expression Function
Nếu function với return type chỉ có một biểu thức (expression) thì định nghĩa function theo 2 cách dưới tương đương nhau: (getInfo()
gọi là Single-Expression Function)
Function Scope
Có 3 loại function (dựa vào mức truy cập):
Member function: Là các function được khai báo ở trong class, object hoặc interface. Các function này được sử dụng thông các instance của class, object hoặc interface. Giống như việc sử dụng method trong Java.
Local function: Có thể hiểu rằng local function là các function được khai báo bên trong một function khác (nested). Local function không được sử dụng ở ngoài function định nghĩa nó. Ví dụ như trong
printArea()
, ta định nghĩa một function khác làcalculateArea()
, do đó ta gọicalculateArea()
là local function:
Lưu ý: Local function có thể sử dụng các param
và các biến khai báo trước nó trong function. Lưu ý các biến khai báo sau nó thì không thể sử dụng:
Top-level function: Có thể hiểu rằng đây là những function được khai báo ngoài tất cả như
class
,object
,interface
và được định nghĩa trong file Kotlin (.kt
). Các method được truy cập thông qua tên của file vs kí hiệu "kt" (đối với Java), trong Kotlin các function này được gọi trực tiếp qua tên của function. Việc này rất hữu ích trong việc định nghĩa các các functionhepler
,util
mà trong Java hay làm thông qua các methodstatic
:
Gọi function Kotlin trong Java:
2. Parameter
Function powerOf
có param number
và exponent
kiểu Int
.
Khai báo param theo cú pháp: <tên param> : <type param>
3. Giá trị mặc định cho parameter
Mỗi param trong function có thể được gán giá trị mặc định hoặc không gán. Giá trị mặc định cho phép lúc truyền param cho function có thể bỏ qua các giá trị mặc định. Điều này giúp không phải viết quá nhiều overload
function.
Lưu ý:
Khi function foo()
của class A
đã khai báo giá trị mặc định cho param, thì khiclass B
kế thừa class A
và override
lại function foo()
đó, thì giá trị mặc định của param ở function foo()``class A
được giữ lại và ở class B
không được định nghĩa lại giá trị mặc định đó.
Đặt tên cho đối truyền vào
Đầu tiên ta có function reformat()
với các param, trong đó có 4 param có giá trị mặc định.
Có thể gọi function theo các cách:
Sử dụng các giá trị mặc định của param
Không sử dụng các giá trị mặc định của param
Hoặc có thể đặt tên cho các đối truyền vào để dễ đọc hơn (tùy chọn). Lưu ý là tên được đặt sẽ phải giống với tên param của function đó
Lưu ý:
Khi sử function của
Kotlin
trong Java, các param được khai báo giá trị mặc định sẽ không có tác dụng. VìJava
không thể bỏ qua các param có giá trị mặc định.Khi sử dụng
method
củaJava
trongKotlin
, không thể sử dụng được chức năng đặt tên cho đối truyền vào.
4. Unit-returning functions
Unit
ở đây có thể hiểu như là Void
ở trong Java
hoặc các ngôn ngữ khác. Việc khai báo return type là Unit
là không bắt buộc. Ví dụ như:
Unit
cũng được sử dụng trong việc khai báo các Higher-Order Function ở phần sắp tới.
5. Extension functions
Giống với Swift
, Kotlin
cho phép ta mở rộng class
mà không phải kế thừa từ class
khác. Ví dụ như ta muốn thêm function swap()
cho class MutableList<Int>
:
Từ khóa this
ở đây dùng để chỉ đến instance
MutableList<Int>
mà gọi function swap()
Tuy nhiên nếu extension
cho MutableList<Int>
chúng ta chỉ sử dụng được với các instance
của MutableList<Int>
, chúng ta cũng có thể khởi tạo chung bằng cách sử dụng Generic Function:
6. Return nhiều giá trị (Mutiple return values)
Xem ví dụ dưới đây:
Như ta thấy, function có thể trả về đồng thời 2 giá trị result
và status
. Bản chất của việc này là gói chúng vào một data class
mà thôi và sử Destructure
(trình bày phần tiếp theo) để gán chúng cho các biến. Nhìn đến đây ta có thể nghĩ đến sử dụng Pair<L, R>
. Tuy nhiên việc sử dụng class
với các tên có nghĩa giúp code dễ đọc hơn việc sử dụng first
và second
trong Pair
.
Destructuring Declarations
Xem ví dụ dưới đây:
Đoạn code trên sau khi được complie thực ra sẽ như thế này:
Ta có data class
với primary constructor
có 2 param name
và age
, class
sẽ lần lượt tự động tạo ra các function componentN
(N: 1, 2, 3, ...) cho các param.
Lưu ý chỉ có các param trong primary constructor
mới được tự động tạo ra function component
. Nếu chúng ta khai báo thêm biến trong class
và muốn sử dụng Destructure
thì cần khởi tạo thêm các function component
tương ứng với param đó. Ví dụ như:
Nếu như trong class Person
, ta chỉ cần lấy 2 giá trị là age
và province
, đồng thời không muốn tạo ra biến name
ta sử dụng dấu "_"
để thay cho các biến không cần sử dụng:
7. Generic functions
Giống như Java
, Kotlin
cho phép sử dụng generic function
giúp cho việc giảm số lượng code, function có thể sử dụng với nhiều kiểu khác nhau Để định nghĩa generic function
, ta sử dụng form sau:
Để gọi function, cần xác định kiểu cho function:
Ngoài ra, giống như Java
, ta cũng có thể tạo generic function
với kiểu được extends
từ một kiểu khác:
Bây giờ, ta có thể gọi function với các biến có kiểu là subclass
của Comparable
:
8. Infix notation
Xem ví dụ dưới đây:
Nhờ sử dụng ký hiệu infix
cho function flyTo()
, ta có thể sự dụng tên function như trung tố liên kết giữa instance class
và param
truyền vào. Function có thể sử dụng infix notation
(trung tố) khi
Function là member của một class hoặc là extension của class
Function chỉ có một param duy nhất
Function được mark bằng
infix
ở đầu function
9. Function với parameter không xác định
Tương tự trong Java
, Kotlin
cho phép một function không cần xác định số lượng param một cách cụ thể.
Java
Kotlin
Ta sử dụng từ khóa vararg
. Và cũng tương tự như Java
, biến array được coi là một mảng.
Lưu ý: Chỉ có một param được đánh dấu là vararg
. Nếu param không phải là param cuối cùng, khi gọi hàm, ta phải chỉ định rõ các param sau đó
Sử dụng function multiPrint()
:
10. Inline function
Inline function được giải thích ở đây