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:
doSomethingKhai 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,interfacevà đượ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,utilmà 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
Kotlintrong Java, các param được khai báo giá trị mặc định sẽ không có tác dụng. VìJavakhông thể bỏ qua các param có giá trị mặc định.Khi sử dụng
methodcủaJavatrongKotlin, 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 classvớ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