Scala
Scala viết tắt cho Scalable Language và là một loại ngôn ngữ lập trình đa mẫu hình. Kết hợp lập trình hướng đối tượng (OOP) và lập trình hàm (Functional Programming).
Lập trình hướng đối tượng (Object Oriented)
Scala là loại ngôn ngữ lập trình hướng đối tượng. Tất cả gía trị đều là object. Loại và tính chất của object được định nghĩa qua Class và Traits
Lập trình hàm (Functional)
Scala là ngôn ngữ lập trình hàm. Tất cả functions (methods) là gía trị và tất cả gía trị là object (như đề cập ở trên), nên tất cả functions đều là objects.
Scala cho phép:
- Anonymous Functions: Functions mà không được nối với một định danh nào cả. Được sử dụng làm parameter của Higher-Order Function hoặc tạo Higher-Order Function (tương tự như lambda function).
scala (x:Int) => x+1
- Higher-Order Functions: parameter của một function có thể là một function khác. Đồng thời function trong scala có thể trả về một function khác.
Functions trong scala có thể được sử dụng như sau sau:
- Nested: Có thể tạo một function trong một function khác. Ví dụ (không cần hiểu syntax qúa sâu)
// Tính giai thừa
def factorial(x: Int): Int = {
// Function này được tạo trong function khác
def fact(x: Int, accumulator: Int): Int = {
if (x <= 1) accumulator
else fact(x - 1, x * accumulator)
}
fact(x, 1)
}
println("Factorial of 2: " + factorial(2)) // Factorial of 2: 2
println("Factorial of 3: " + factorial(3)) // Factorial of 3: 6
- Currying: Chuyển 1 function lấy nhiều parameter thành một chuỗi functions mà chỉ lấy một parameter. Ví dụ:
def curryBinaryOperator[A](operator: (Int, Int) => Int): Int => (Int => Int) = {
def curry(a: Int): Int => Int = {
(b: Int) => operator(a,b)
}
curry
}
def add(a: Int, b: Int) = a + b // (Int, Int) => Int
def multiply(a: Int, b: Int) = a * b // (Int, Int) => Int
val addCurried = curryBinaryOperator(add) // Int => (Int => Int)
val multiplyCurried = curryBinaryOperator(multiply) // Int => (Int => Int)
Bạn chỉ cần biết là ta có thể chuyền function A cho function B, và sử dụng function A để đưa ra kết quả bạn muốn trong function B. Những khái niệm này đối với bạn chưa lập trình Functional Programming thì sẽ không cần phải hiểu chi tiết. Bạn nên biết là lập trình bằng Scala có thể làm được như vậy.
Scala có type cố định
Phải xác định object có type gì khi compile code. Nhưng khác với các ngôn ngữ lập trình có type cố định khác, bạn sẽ không cần phải định nghĩa type cho variable trực tiếp trong code. Và không phải định nghĩa lại type của variable mới nếu sử dụng trong tính toán.
Scala chạy trên JVM
Scala code được compile thành Java code và chạy trên Java Virtual Machine (JVM). Vì vậy Scala rất thích hợp để sử dụng cho Spark, vì Spark sẽ compile và chạy code trên môi trường Java. Scala cũng sẽ nhanh hơn nhiều so với code python, vì code python phải được convert để chạy trên JVM.
Sử dụng thư viện Java trong code Scala
Bạn có thể sự dụng tất cả các Class trong Java SDK, và các Java Class bạn tự tạo riêng trong Scala
Cài đặt môi trường
Bạn có thể cài đặt scala sử dụng blog tại đây:
https://itexpertvn.com/scala-cai-dat-moi-truong/
Các bạn nên sử dụng eclipse để code Scala:
http://scala-ide.org/
Khái niệm cơ bản:
Lập trình Scala và Java tương tự như nhau. Có một số từ khóa sử dụng trong Scala mà các bạn nên biết:
- Object : Object có tính chất (properties, attributes) và hành động. Ta sử dụng một Class chung để tạo ra một object có tính chất và hành động riêng biệt.
- Class : Là thiết kế để tạo tính chất, và các hành động. Một class có nhiều tính chất và hành động
- Method : Là hành động, có input và có thể có output.
- Field: Mỗi object có mốt số variables, thể hiện cho tính chất của object. Ta gọi những variables của object là fields. Ta có thể đặt gía trị cho fields.
- Closure: là một hành động, sử dụng input variable từ bên ngoài để đưa ra output gì đó. Ví dụ:
var factor = 3
val multiplier = (i:Int) => i * factor
- Traits (tương tự như abstract class trong Java): bao gồm định nghĩa của Method và Field, và tái sử dụng qua các Class. Trait được sử dụng để định nghĩa loại object qua các method đặc trưng . Ví dụ:
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
Chương trình đầu tiên: Hello World
Chạy bằng script:
- Mở terminal/command prompt và chạy scala:
>scala
Nếu Scala được install rồi sẽ hiện lên thông tin sau
Welcome to Scala version 2.9.0.1
Type in expressions to have them evaluated.
Type :help for more information.
In "Hello World!":
scala> println("Hello World!");
Kết quả sẽ là:
Hello World!
Chạy Script.
- Trong vim hoặc Eclipse, copy code sau
object HelloWorld {
/*
* Đây là program đầu tiên viết bằng Scala của bạn
* ở dưới là method dể print "Hello World" trong main Thread.
* Rất giống với Java.
*/
def main(args: Array[String]) {
println("Hello world!") // Hello World
}
}
- Lưu vào file HelloWorld.scala
- Chạy command sau để compile code
\> scalac HelloWorld.scala
- Chạy chương trình HelloWorld
\> scala HelloWorld
- Kết quả sẽ là
Hello World!
Chú thích: Khi bạn viết code scala trên Eclipse và save lại thì code scala sẽ được tự động chạy, và kết quả của mỗi câu lệnh sẽ được hiển thị ở comment bên phải.
Quy định cơ bản trong lập trình Scala
Các quy định về cách đặt tên trong Scala rất giống với Java. Đối với các bạn chưa có kinh nghiệm lập trình Java, thì các quy định ở dưới đây
- Trong scala, viết hoa và viết thường có ý nghĩa khác nhau.
- Tên class: Tất cả các từ đều được viết liền và viết hoa. Ví Dụ: HelloWorldClass
- Tên method: Tên của method được bắt đầu bằng chữ thường. Các từ sau viết hoa chữ cái đầu. Ví dụ printHelloWorld()
- Tên file: tên của chương trình giống hệt với tên file. Nên save file bằng tên của object, object bao hàm tất cả code trong file. Thêm extension .scala đằng sau.
- def main(args: Array[String]): method cần thiết cho tất cả chương trình viết bằng Scala. Code sẽ được bắt đầu triển khai từ method main này.
- ";" là không cần thiết, trừ khi có nhiều câu lệnh trong cùng một dòng. Ví dụ nhiều câu lệnh trong một dòng:
val s = "hello"; println(s)
- Comment: Inline comment sẽ như sau:
// Comment 1 dòng
Multi-line comment:
/*
* Comment nhiều dòng
*
*/
Dưới đây là các từ từ khóa trong Scala. Các bạn chú ý không đặt tên class, method, variables bằng các từ khóa này:
Bạn có thể đặt tên cho module của bạn. Module là, một folder chưa các code có liên kết với nhau dùng để hoàn thành một mục đích:
package com.vnlab.helloworld
Bạn cũng có thể import các thư viện:
import scala.collection.mutable.HashMap
Lời kết
Vậy là các bạn đã viết được chương trình bằng Scala đầu tiên và hiểu được một số khái niệm cơ bản trong lập trình Scala. Bài viết tiếp theo, chúng ta sẽ học về các syntax chính: Variables, Class, Methods, If-Else, For-Loop trong Scala.