CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnTop 30+ câu hỏi phỏng vấn Scala kèm đáp án
Chuyên gia

Top 30+ câu hỏi phỏng vấn Scala kèm đáp án

CyStack blog 16 phút để đọc
CyStack blog12/08/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 16 minutes

Chào mừng bạn đến với bộ câu hỏi phỏng vấn Scala thường gặp và cách trả lời ấn tượng.

câu hỏi phỏng vấn Scala

Hiện nay, hầu hết các công ty trong lĩnh vực Tài chính/Ngân hàng, Chính phủ, Viễn thông, Mạng xã hội… đều đang sử dụng Scala, cùng với các bộ khung phát triển phần mềm như PlayAkka để phát triển dự án của họ.

Lý do là vì các bộ khung này hỗ trợ cả lập trình hướng đối tượng (OOP) lẫn lập trình hàm (FP), đồng thời mang lại nhiều lợi ích vượt trội.

Các câu hỏi phỏng vấn Scala

Tôi sẽ chia sẻ với bạn kiến thức phỏng vấn và kinh nghiệm phát triển Fullstack Scala (bao gồm Scala/Play/Akka) của mình thông qua một vài bài viết.

Tôi sẽ chia thành 3 bài viết riêng biệt. Một số câu hỏi chỉ là câu đơn, trong khi một số khác có thêm các câu hỏi phụ.

Tổng cộng, tôi sẽ thảo luận khoảng 200 câu hỏi.

Tôi cá rằng: nếu bạn nắm vững toàn bộ những câu hỏi này, bạn hoàn toàn có thể vượt qua bất kỳ buổi phỏng vấn Scala Developer nào.

Tuy nhiên, nếu bạn muốn theo đuổi sự nghiệp Fullstack Scala Developer, bạn nên học thật kỹ tất cả các công nghệ trong hệ sinh thái Fullstack Scala.

Giới thiệu

Tôi sẽ chia sẻ các câu hỏi và câu trả lời phỏng vấn Scala/Play/Akka thành 3 phần chính:

  1. Câu hỏi phỏng vấn Scala cơ bản: Chúng ta sẽ cùng thảo luận các câu hỏi phỏng vấn Scala cơ bản, phù hợp với người mới bắt đầu, lập trình viên Java muốn chuyển sang Scala, hoặc những người đã có trên 1 năm kinh nghiệm với Scala.
  2. Câu hỏi phỏng vấn Scala trung cấp: Chúng ta sẽ thảo luận các câu hỏi phỏng vấn phù hợp với người có trên 2 năm kinh nghiệm làm việc với Scala hoặc Java.
  3. Câu hỏi phỏng vấn Scala nâng cao: Phần này dành cho các Senior hoặc lập trình viên Scala/Java có nhiều kinh nghiệm, với các câu hỏi chuyên sâu.
  4. Câu hỏi phỏng vấn về xử lý đa luồng và song song trong Scala và Java: Trong phần này, chúng ta sẽ tìm hiểu các câu hỏi phỏng vấn liên quan đến đa luồng và xử lý song song trong Scala/Java, phù hợp với các developer cấp cao.

Ngoài ra, chúng ta cũng sẽ so sánh một số điểm khác biệt giữa các cấu trúc của Scala và Java, giúp các lập trình viên đang chuyển từ Java sang Scala dễ dàng tiếp cận và học hỏi hơn.

Trong bài viết này, chúng ta sẽ bắt đầu với các câu hỏi phỏng vấn Scala cơ bản.

Câu hỏi phỏng vấn Scala cơ bản

Trong phần này, chúng ta sẽ liệt kê tất cả các câu hỏi phỏng vấn Scala cơ bản. Ở phần tiếp theo, từng câu hỏi sẽ được giải thích chi tiết.

  1. Scala là gì? Đây là một ngôn ngữ hay một nền tảng? Scala hỗ trợ lập trình hướng đối tượng hay lập trình hàm ? Ai là “cha đẻ” của Scala?
  2. Scala có phải là ngôn ngữ được kiểm tra kiểu tĩnh không? Kiểu tĩnh là gì? Kiểu động là gì? Sự khác biệt giữa hai kiểu này là gì?
  3. Scala có phải là ngôn ngữ hoàn toàn hướng đối tượng không? Java có phải là ngôn ngữ hoàn toàn hướng đối tượng không?
  4. Scala có hỗ trợ đầy đủ các khái niệm lập trình hàm không? Java 8 có hỗ trợ đầy đủ các khái niệm đó không?
  5. Những ưu điểm chính của ngôn ngữ Scala là gì? Scala có những nhược điểm nào không?
  6. Nhược điểm lớn nhất của ngôn ngữ Scala là gì?
  7. Mục tiêu cốt lõi của ngôn ngữ Scala là gì?
  8. Hiện nay có những ngôn ngữ chạy trên JVM phổ biến nào?
  9. Tương tự như lớp java.lang.Object trong Java, lớp cha của tất cả các lớp trong Scala là gì?
  10. Trong Scala, từ khóa truy cập mặc định là gì? Scala có từ khóa public không?
  11. “Type Inference” trong Scala là gì?
  12. Sự khác biệt giữa Int trong Scala và java.lang.Integer trong Java là gì? Mối quan hệ giữa IntRichInt trong Scala là gì?
  13. Nothing trong Scala là gì? Nil trong Scala là gì? Mối liên hệ giữa NothingNil là gì?
  14. Null trong Scala là gì? null trong Scala là gì? Sự khác biệt giữa Nullnull là gì?
  15. Unit trong Scala là gì? Khác biệt giữa void trong Java và Unit trong Scala là gì?
  16. Sự khác biệt giữa valvar trong Scala là gì?
  17. REPL trong Scala là gì? Tác dụng của REPL là gì? Làm sao để mở Scala REPL từ dòng lệnh (CMD)?
  18. Scala có những đặc điểm nổi bật nào?
  19. Làm thế nào để triển khai vòng lặp theo phong cách hàm? Sự khác nhau giữa vòng lặp trong hướng đối tượng và lập trình hàm là gì?
  20. “Application” trong Scala là gì? App trong Scala là gì? Tác dụng của App trong Scala là gì?
  21. Scala có hỗ trợ nạp chồng toán tử không? Java thì sao?
  22. Biểu thức là gì? Câu lệnh là gì? Sự khác biệt giữa hai khái niệm này là gì?
  23. Sự khác biệt giữa cấu trúc If…Else trong Java và trong Scala là gì?
  24. Scala là ngôn ngữ dựa trên biểu thức hay câu lệnh ? Java thì sao?
  25. Hãy kể một số tính năng mà Java có nhưng Scala không có, và ngược lại?
  26. Sự khác biệt giữa FunctionMethod trong Scala là gì?
  27. Trong một file mã nguồn Scala, có thể định nghĩa bao nhiêu lớp public?
  28. Giống như Java, Scala có những thư viện nào được import mặc định?
  29. Scala có bao nhiêu toán tử? Và vì sao lại như vậy?
  30. Hãy kể một số từ khóa mà Java dùng nhưng Scala không cần? Vì sao Scala không cần những từ khóa đó?
  31. PreDef trong Scala là gì?

Câu hỏi & Trả lời phỏng vấn Scala

Trong phần này, chúng ta sẽ đi sâu vào từng câu hỏi trong danh sách phía trên và giải thích chi tiết, kèm theo ví dụ minh họa nếu cần thiết.

Scala là gì? Đây là ngôn ngữ hay nền tảng? Scala hỗ trợ OOP hay FP? Ai là cha đẻ của Scala?

Scala là viết tắt của SCAlable LAnguage. Martin Odersky là người sáng lập Scala. Scala là một ngôn ngữ lập trình đa mô hình, hỗ trợ cả lập trình hướng đối tượng (OOP) và lập trình hàm (FP). Nó được thiết kế và phát triển bởi chính Martin Odersky. Scala là một ngôn ngữ hướng đối tượng – hàm an toàn kiểu, chạy trên nền tảng JVM. Nó có hệ thống kiểu mạnh và tĩnh, nghĩa là mọi kiểu đều được kiểm tra ngay trong lúc biên dịch.

Scala có phải là ngôn ngữ định kiểu tĩnh không? Ngôn ngữ định kiểu tĩnh và định kiểu động là gì? Sự khác biệt giữa chúng là gì?

Có, Scala là ngôn ngữ định kiểu tĩnh. Điều này có nghĩa là quá trình kiểm tra kiểu được thực hiện trong lúc biên dịch, chứ không phải trong lúc chạy chương trình.

Ưu điểm chính của loại ngôn ngữ này là lập trình viên cần viết mã chính xác ngay từ đầu để tránh lỗi biên dịch. Vì nhiều lỗi đã được phát hiện sớm, nên sẽ ít lỗi hơn khi chạy chương trình.

Ví dụ: Java, Scala, C, C++, Haskell…

Ngược lại, ngôn ngữ định kiểu động là ngôn ngữ mà việc kiểm tra kiểu diễn ra trong lúc chạy. Vì trình biên dịch không kiểm tra kiểu từ trước, nên dễ xảy ra lỗi khi chạy.

Ví dụ: Groovy, JavaScript, Ruby, Python, Smalltalk…

Scala có phải là ngôn ngữ hướng đối tượng thuần túy không? Java thì sao?

Ngôn ngữ hướng đối tượng thuần túy nghĩa là mọi thứ đều là đối tượng.

Java không phải là ngôn ngữ OOP thuần túy vì nó vẫn hỗ trợ:

  • Kiểu dữ liệu nguyên thủy như int, char…, vốn không phải là đối tượng.
  • Thành viên tĩnh, vốn không gắn với bất kỳ đối tượng cụ thể nào.

Scala là ngôn ngữ hướng đối tượng thuần túy vì trong Scala, mọi thứ đều là đối tượng và giá trị. Hàm cũng là giá trị, và giá trị là đối tượng. Scala không có kiểu dữ liệu nguyên thủy và cũng không có thành viên tĩnh.

Scala có hỗ trợ tất cả các khái niệm lập trình hàm không? Còn Java 8 thì sao?

Scala hỗ trợ đầy đủ các khái niệm của lập trình hàm. Trong khi đó, Java 8 chỉ mới giới thiệu một số khái niệm của lập trình hàm, nhưng không hỗ trợ toàn diện.

Ví dụ: Java 8 không hỗ trợ pattern matching, function currying, implicits…

Ưu điểm chính và nhược điểm của Scala là gì?

Ưu điểm:

  • Code đơn giản và súc tích
  • Cú pháp biểu đạt cao
  • Dễ đọc
  • Ngôn ngữ an toàn kiểu 100%
  • Hỗ trợ tính bất biến, tránh side-effects
  • Khả năng tái sử dụng mã cao
  • Dễ mô-đun hóa
  • Làm được nhiều việc với ít mã hơn
  • Cú pháp linh hoạt
  • Hỗ trợ đầy đủ các tính năng của OOP
  • Hỗ trợ đầy đủ các tính năng của FP
  • Ít lỗi hơn
  • Lập trình song song và bất đồng bộ tốt hơn
  • Code dễ mở rộng và dễ bảo trì
  • Tăng năng suất
  • Phù hợp với các ứng dụng phân tán
  • Tương thích hoàn toàn với Java
  • Có nhiều DSL mạnh
  • Có REPL để học cơ bản Scala dễ dàng

Nhược điểm:

  • Code có thể khó đọc nếu viết không cẩn thận
  • Khó tiếp cận đối với người mới bắt đầu
  • Cú pháp tương đối phức tạp
  • Khả năng tương thích ngược kém

Lưu ý: Scala cho phép bạn viết mã theo cách dễ đọc hoặc rối rắm, tùy vào trình độ và phong cách lập trình.

Nhược điểm chính của Scala là gì?

Dù có nhiều ưu điểm, Scala gặp một vấn đề lớn là khả năng tương thích ngược thấp. Khi nâng cấp phiên bản Scala, có thể bạn sẽ phải sửa đổi tên package, class, hàm hoặc function.

Ví dụ: nếu dự án đang dùng annotation @BeanProperty trong package scala.reflect.BeanProperty của phiên bản cũ, thì ở phiên bản mới, bạn sẽ cần chuyển sang scala.beans.BeanProperty.

Khẩu hiệu của Scala là gì?

Nếu Java có khẩu hiệu “Viết một lần, chạy mọi nơi”, thì Scala có khẩu hiệu “Làm nhiều việc hơn với ít mã hơn”.

Những ngôn ngữ chạy trên JVM phổ biến hiện nay là gì?

Các ngôn ngữ phổ biến bao gồm Java, Scala, Groovy và Clojure.

Trong đó, Scala, Groovy và Clojure hỗ trợ cả lập trình hướng đối tượng và lập trình hàm.

Java SE 8 hỗ trợ đầy đủ tính năng OOP, nhưng chỉ hỗ trợ một phần FP, ví dụ như lambda expressions, higher-order functions, type inference…

Tương tự như java.lang.Object trong Java, lớp cha của mọi lớp trong Scala là gì?

Trong Java, lớp cha của mọi lớp là java.lang.Object.

Tương tự, trong Scala, lớp cha của mọi lớp hoặc trait là Any, được định nghĩa trong package scala, cụ thể là scala.Any.

Từ khóa truy cập mặc định trong Scala là gì? Scala có từ khóa public không?

Nếu bạn không chỉ định rõ mức truy cập cho một method, function, trait, object hoặc class trong Scala, thì mặc định sẽ là public. Điều này cũng đúng với các field. Vì đã có mặc định như vậy nên Scala không cần từ khóa public.

Type Inference trong Scala là gì?

Suy diễn kiểu là việc trình biên dịch Scala tự động xác định kiểu dữ liệu trong lúc biên dịch.

Ví dụ: khi bạn khai báo biến mà không ghi rõ kiểu, Scala sẽ đoán kiểu dựa trên giá trị bạn gán.

Việc này áp dụng cho biến, đối tượng, tham số và kiểu trả về của hàm…

Sự giống và khác nhau giữa Scala’s Int và Java’s java.lang.Integer là gì? Mối quan hệ giữa IntRichInt trong Scala?

Giống nhau:

  • Cả hai đều là lớp
  • Cả hai đều dùng để biểu diễn số nguyên
  • Đều là số nguyên 32-bit có dấu

Khác nhau:

  • Int trong Scala không triển khai Comparable
  • Integer trong Java triển khai Comparable

Về mối quan hệ giữa IntRichInt: khi bạn dùng Int trong Scala, trình biên dịch sẽ tự động chuyển đổi sang RichInt để bạn có thể dùng thêm nhiều phương thức nâng cao hơn.

RichInt là một lớp implicit, nằm trong package scala.runtime.

Nothing và Nil trong Scala là gì? Chúng có quan hệ gì với nhau?

Nothing là một kiểu đặc biệt trong Scala, nằm ở dưới cùng của hệ thống kiểu — tức là kiểu con của mọi kiểu khác. Không có đối tượng nào là instance của Nothing.

Chúng ta thường dùng Nothing khi viết những cấu trúc như Nil hoặc None.

Ví dụ: NilNone đều được định nghĩa bằng cách sử dụng Nothing.

object None extends Option[Nothing]

Chúng ta có thể sử dụng Nothing làm kiểu trả về cho các phương thức không bao giờ trả về kết quả.

Chúng ta cũng có thể dùng Nothing làm kiểu trả về cho các phương thức kết thúc một cách bất thường, ví dụ như ném exception.

Nil là một đối tượng dùng để biểu diễn danh sách rỗng.

Nó được định nghĩa trong package scala.collection.immutable, như ví dụ bên dưới:

object Nil extends List[Nothing]

Ví dụ:

scala> Nil
res5: scala.collection.immutable.Nil.type = List()

scala> Nil.length
res6: Int = 0

Null trong Scala là gì? Null và null khác nhau như thế nào trong Scala?

Null là một kiểu dữ liệu trong Scala. Đây là một lớp cuối cùng có tên đầy đủ là scala.Null, nằm trong package scala.

Kiểu Null chỉ có duy nhất một instance, đó là null.

Trong Scala, null là đối tượng duy nhất thuộc kiểu scala.Null.

Ví dụ:

scala> val myNullRef : Null = null
myNullRef: Null = null

Chúng ta không thể gán bất kỳ giá trị nào khác cho biến có kiểu Null. Kiểu này chỉ chấp nhận duy nhất giá trị null.

Null là kiểu con của tất cả các kiểu tham chiếu và nằm ở đáy của hệ thống kiểu trong Scala.

Null không phải là kiểu con của các kiểu giá trị, nên chúng ta không thể gán null cho các biến có kiểu giá trị như Int, Double, Boolean

Ví dụ:

scala> val myInt : Int = null
:10: error: an expression of type Null is ineligible for implicit conversion
       val myInt : Int = null

Ở ví dụ trên, chương trình sẽ báo lỗi kiểu:

Tìm thấy: Null (null) nhưng yêu cầu: Int.

Việc chuyển đổi ngầm định từ Null sang Int không khả dụng vì bị mơ hồ.

Unit trong Scala là gì? Unit khác gì với void trong Java?

Trong Scala, Unit được dùng để biểu thị “không có giá trị” hoặc “không có giá trị hữu ích”.

Unit là một lớp cuối cùng được định nghĩa trong package scala với tên đầy đủ là scala.Unit.

Unit khá giống với void trong Java, nhưng có một vài điểm khác biệt:

  • void trong Java không biểu diễn bất kỳ giá trị nào, nó hoàn toàn là “rỗng”.
  • Unit trong Scala có một giá trị duy nhất, đó là () (cặp ngoặc tròn không chứa gì).
  • () là giá trị duy nhất của kiểu Unit trong Scala. Trong khi đó, void trong Java không có bất kỳ giá trị nào.
  • void là từ khóa trong Java, còn Unit là một lớp trong Scala.
  • Cả hai đều được dùng cho các phương thức hoặc hàm không trả về giá trị nào.

Sự khác nhau giữa valvar trong Scala là gì?

Trong Scala, cả valvar đều được dùng để khai báo biến, nhưng khác nhau về khả năng thay đổi:

  • var viết tắt của “variable” (biến), tức là có thể thay đổi.
  • val viết tắt của “value” (giá trị), tức là không thay đổi được.

Cụ thể:

  • var dùng để khai báo biến có thể thay đổi, nghĩa là bạn có thể gán lại giá trị mới sau khi khởi tạo.
  • val dùng để khai báo biến không thể thay đổi, nghĩa là sau khi gán giá trị ban đầu, bạn không thể thay đổi nó nữa.

Hiểu đơn giản theo cách Java:

  • var giống như biến thông thường.
  • val giống như biến khai báo với từ khóa final.

REPL trong Scala là gì? Dùng để làm gì? Truy cập như thế nào từ Command Prompt?

REPL là viết tắt của Read-Evaluate-Print Loop, có thể phát âm là “ripple”.

Trong Scala, REPL hoạt động như một trình thông dịch cho phép bạn viết và chạy mã Scala trực tiếp từ dòng lệnh.

Vì vậy, REPL còn được gọi là Scala CLI (Command Line Interface) hoặc trình dòng lệnh Scala.

Mục đích chính của REPL là giúp bạn phát triển và kiểm thử các đoạn mã nhỏ, rất hữu ích cho việc luyện tập hoặc học nhanh ngôn ngữ Scala.

REPL đặc biệt phù hợp với người mới bắt đầu để thử nghiệm các chương trình đơn giản.

Bạn có thể truy cập REPL bằng cách mở Command Prompt và gõ lệnh:

D:\\> scala

scala>

Những tính năng nổi bật của Scala là gì?

Ngôn ngữ Scala hỗ trợ các tính năng sau:

  • Hỗ trợ cả lập trình hướng đối tượng kiểu mệnh lệnh và lập trình hàm
  • Là ngôn ngữ hướng đối tượng thuần túy
  • Hỗ trợ đầy đủ các tính năng của lập trình hàm
  • Có REPL (Read-Evaluate-Print Loop) để thực thi mã trực tiếp
  • Hệ thống kiểu mạnh
  • Ngôn ngữ định kiểu tĩnh
  • Suy luận kiểu
  • Hỗ trợ pattern matching
  • Hỗ trợ closures
  • Hỗ trợ cấu trúc dữ liệu bất biến
  • Dùng mô hình Actor để phát triển các ứng dụng đồng thời
  • Tương thích với Java
  • Có đầy đủ công cụ phát triển: IDE, công cụ build, web framework, framework kiểm thử TDD và BDD

Làm thế nào để cài đặt vòng lặp theo kiểu lập trình hàm? Sự khác biệt giữa vòng lặp kiểu OOP và FP là gì?

Chúng ta đã quen với cách viết vòng lặp theo kiểu hướng đối tượng: sử dụng biến tạm thời có thể thay đổi, cập nhật giá trị biến trong vòng lặp bằng các cấu trúc như for, while. Đây là cách làm rườm rà và tiềm ẩn lỗi, không an toàn với luồng.

Phong cách OOP sử dụng:

  • Cấu trúc lặp
  • Tính thay đổi
  • Side effects (tác dụng phụ, thay đổi trạng thái bên ngoài)

Trong khi đó, theo phong cách lập trình hàm, ta có thể triển khai vòng lặp theo cách an toàn hơn với luồng, bằng cách:

  • Dùng đệ quy
  • Đệ quy đuôi
  • Tính bất biến
  • Không có tác dụng phụ

Vì vậy, cùng một logic lặp nhưng triển khai theo hướng hàm sẽ rõ ràng, an toàn và dễ kiểm soát hơn.

Application trong Scala là gì? App trong Scala là gì? Dùng để làm gì?

Trong Scala, App là một trait được định nghĩa sẵn trong package scala, cụ thể là scala.App. Trait này cung cấp sẵn phương thức main.

Khi một đối tượng hoặc lớp mở rộng App, nó sẽ tự động trở thành một chương trình có thể thực thi, vì nó kế thừa sẵn phương thức main từ trait này.

Lợi ích chính khi dùng App là:

  • Không cần viết thủ công hàm main

Hạn chế khi dùng App là:

  • Nếu muốn xử lý tham số dòng lệnh, bạn bắt buộc phải sử dụng tên biến args, vì main() trong scala.App định nghĩa tham số đó với tên này.

Ví dụ: chương trình không sử dụng App:

object MyApp {
    def main( args: Array[String]){
        println("Hello World!")
    }
}

Nếu dùng App, bạn chỉ cần:

object MyApp extends App{
   println("Hello World!")
}

Nếu chúng ta quan sát hai ví dụ ở trên, trong ví dụ thứ hai, ta không cần định nghĩa phương thức main vì đã kế thừa từ trait App trong Scala.

Trước phiên bản Scala 2.9, trait tương đương được gọi là scala.Application, nhưng kể từ Scala 2.9, trait này đã bị thay thế và đánh dấu là không dùng nữa bởi scala.App.

Scala có hỗ trợ nạp chồng toán tử không? Java có hỗ trợ không?

Java không hỗ trợ operator overloading. Scala có hỗ trợ.

Lý do là Java không muốn cho phép đặt tên phương thức gây hiểu nhầm như "+", "*" hay "/". Trong khi đó, Scala cho phép lập trình viên tự quyết định tên của phương thức hoặc hàm, kể cả khi tên đó trông giống một toán tử.

Ví dụ: khi viết 2 + 3 trong Scala, thật ra dấu + không phải là toán tử, mà là một phương thức trong lớp Int (hoặc một kiểu tương ứng được chuyển đổi ngầm định). Nội bộ, câu lệnh 2 + 3 sẽ được biên dịch thành 2.+(3).

Expression là gì? Statement là gì? Sự khác nhau giữa Expression và Statement?

  • Expression: là một đoạn mã có giá trị, tức là nó sẽ được đánh giá thành một giá trị cụ thể. Vì biểu thức trả về giá trị, nên ta có thể gán nó cho một biến.Ví dụ: câu lệnh if trong Scala, hoặc toán tử 3 ngôi trong Java.
  • Statement: là một đoạn mã thực hiện một hành động, thường không trả về giá trị. Vì không có giá trị trả về, nên không thể gán statement cho biến.Ví dụ: câu lệnh if trong Java.

Sự khác biệt giữa if…else trong Java và Scala là gì?

  • Trong Java, if…else là một câu lệnh. Nó không trả về giá trị, nên bạn không thể gán nó cho một biến.Ví dụ:
int year;
 if( count == 0) 
   year = 2014;
 else 
   year = 2015;

If…Else trong Scala: Trong Scala, if…else là một biểu thức. Nó được đánh giá thành một giá trị (tức là có giá trị trả về), vì vậy ta có thể gán nó cho một biến.

 val year = if( count == 0) 2014 else 2015

Lưu ý: if…else trong Scala hoạt động tương tự như toán tử 3 ngôi trong Java.

Chúng ta cũng có thể sử dụng if…else trong Scala theo cách giống với câu lệnh if…else trong Java, như ví dụ dưới đây:

val year = 0
 if( count == 0) 
   year = 2014 
 else 
   year = 2015

Scala là ngôn ngữ dựa trên biểu thức hay câu lệnh ? Còn Java thì sao?

Trong Scala, mọi thứ đều là giá trị. Tất cả các biểu thức hay câu lệnh đều được đánh giá thành một giá trị. Chúng ta có thể gán biểu thức, hàm, closure, object,… cho một biến. Vì vậy, Scala là một ngôn ngữ dựa trên biểu thức.

Ngược lại, trong Java, các câu lệnh không phải là biểu thức và không có giá trị trả về, nên không thể gán chúng cho biến. Do đó, Java là ngôn ngữ dựa trên câu lệnh.

Một số tính năng mà Java có nhưng Scala không có và ngược lại:

  • Java không hỗ trợ nạp chồng toán tử, nhưng Scala có.
  • Java hỗ trợ toán tử ++-, Scala không hỗ trợ.
  • Java có cả ngoại lệ kiểm tra và không kiểm tra, cala không có checked exceptions.
  • Java hỗ trợ breakcontinue, Scala không hỗ trợ các câu lệnh này.
  • Java hỗ trợ ép kiểu tường minh, Scala không hỗ trợ.
  • Scala hỗ trợ pattern matching, Java không hỗ trợ (hoặc chỉ hỗ trợ một phần từ Java 17 trở lên).
  • Java có kiểu dữ liệu nguyên thủy, Scala không có – mọi thứ đều là object.
  • Java hỗ trợ thành viên static, Scala không có khái niệm static.
  • Scala hỗ trợ implicits và traits, Java thì không.

Lưu ý: Danh sách này còn dài hơn, nhưng đây là những điểm khác biệt chính thường được hỏi trong phỏng vấn Scala.

Sự khác nhau giữa Function và Method trong Scala là gì?

Scala hỗ trợ cả hàm và phương thức. Cách khai báo hai loại này gần như giống nhau, nhưng có một điểm khác biệt nhỏ:

  • Method được định nghĩa bên trong class hoặc trait, gắn liền với object (một instance của class). Bạn phải dùng object để gọi method.
  • Function không gắn với class hay trait, mà thường được định nghĩa ở cấp package. Có thể gọi trực tiếp function mà không cần thông qua object, giống như static method trong Java.

Lưu ý: Các khái niệm như class, trait, package, object sẽ được đề cập trong các phần sau.

Trong một tệp Scala, có thể định nghĩa bao nhiêu class công khai?

Trong Java, một tệp nguồn chỉ được phép có tối đa một lớp hoặc interface public.

Trong Scala thì không có giới hạn này — bạn có thể định nghĩa nhiều class, interface hoặc trait public trong cùng một tệp nguồn.

Giống như Java có import mặc định java.lang, Scala có những import mặc định nào?

Scala tự động import các thành phần sau trong mọi chương trình:

  • java.lang
  • scala
  • scala.PreDef

Nhờ đó, bạn không cần phải import println, String, Int, v.v. vì các đối tượng và phương thức này đã có sẵn thông qua PreDef.

Trong Scala có bao nhiêu toán tử? Và vì sao?

Khác với Java nhưng giống với C++, Scala hỗ trợ nạp chồng toán tử.

Trên thực tế, Scala chỉ có duy nhất một toán tử thực sự, đó là =.

Tất cả những ký hiệu khác như +, -, *, v.v. đều là phương thức.

Ví dụ: 2 + 3 trong Scala thật ra được biên dịch thành 2.+(3)

Scala Compiler sẽ xác định kiểu của 2Int, sau đó tìm trong class Int xem có phương thức + hay không. Nếu có, nó sẽ gọi như sau: 2.+(3)

Cách viết này là “syntactic sugar” (đường cú pháp) giúp mã Scala ngắn gọn và gần với phong cách hàm hơn.

Một số từ khóa Java sử dụng nhưng Scala không cần đến là gì? Vì sao Scala không cần chúng?

Java sử dụng các từ khóa sau khá thường xuyên:

  • public — để khai báo class, interface, biến, v.v.
  • static — để khai báo thành viên tĩnh

Scala không cần và cũng không có hai từ khóa này.

  • Trong Scala, access modifier mặc định là public cho class, trait, method, field… nên không cần viết từ public.
  • Để tuân thủ nguyên lý hướng đối tượng, Scala loại bỏ static, điều này giúp code dễ kiểm soát hơn trong các ứng dụng có xử lý đồng thời, vì static không an toàn với luồng.

PreDef trong Scala là gì? Mục đích của nó là gì?

PreDef là một object tiện ích được định nghĩa sẵn trong package scala dưới tên scala.PreDef.

Object này cung cấp một số phương thức hữu ích như:

  • In ra console: print, println,…
  • Các tiện ích xử lý chuỗi, xử lý collection
  • Các hàm chuyển đổi ngầm định
  • Các hàm kiểm tra điều kiện như require, assert,…

Ví dụ: println, readLine, require, readInt… đều được định nghĩa trong PreDef.

Scala compiler tự động import PreDef vào mọi class, object và trait trong chương trình, vì vậy bạn có thể dùng các hàm này mà không cần import thủ công.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất