Java

Các điểm khác nhau về syntax giữa java và scala (p2)

Chào các bạn mình xin được tiếp tục loạt bài tìm hiểu về Các điểm khác nhau về syntax giữa java và scala, bài chia sẻ lần trc mình có nói một vài điểm cũng là cơ bản thôi, mình thì cứ đọc sách thấy chỗ nào hay lại note lại rồi chia sẻ với mọi người thôi. Bạn nào chưa đọc qua bài trước của mình thì có thể vào link sau nhé https://viblo.asia/p/cac-diem-khac-nhau-ve-syntax-giua-java-va-scala-p1-3Q75w2N2lWb ? Còn hôm nay mình nói về các điểm thú vị sử dụng toán tử, điểm khác nhau khi sử dụng try catch finally, match expressions trong scala, sử dụng break và variable scope.

1.Toán tử đặc biệt

Trong phần toán tử này nói là phân biệt điểm khác nhau với java thì không đúng lắm, chính xác là mình muốn nêu ra điểm thú vị dễ gây nhầm lẫn khi sử dụng toán tử dịch bít như sau: 2 << 2 + 2 thông thường mình hay hiểu đó là dịch bít 2 << 2 xong rồi mới cộng với 2, nhưng không pải scala sẽ hiểu là 2 << 4 và kết quả = 32 hay như biểu thức này 2 + 2 << 2 kết quả = 16 vì nó sẽ tính 2 + 2 = 4 rồi tính 4 << 2 = 16

Như bài trước mình có nói đến mỗi toán tử trong scala đều là method vd như:

a * b tức là a.*(b) , nhưng có toán này đặc biệt hay dùng để ghép phần tử và một List như:a ::: b thì scala lại biên dịch ra là b.:::(a) chứ không phải thông thường mình hiểu: a.:::(b)đó là điều mà các bạn cần chú ý nhé =)) một ví dụ tương tự với chú ý trên là: a ::: b ::: c thực chất biên dịch nó là a ::: (b ::: c) . a * b * c , với biểu thức này thực chất nó lại là(a * b) * c.

2.Match expressions

Trong java hay nhiều ngôn ngữ khác các bạn đã quen với switch case, nhưng trong scala thì sử dụng match case thay thế switch case. Có một vài điểm khác nhau quan trọng so với switch case bất kỳ loại constant nào cũng có thể sử dụng được, không giống như switch case chỉ sử dụng kiểu integer, string và enum constants. Match case không dùng break cho mỗi case.

vd:

java:
int i = (int) Math.random();
switch (i) {
    case 1:
        System.out.println("1");
        break;
    case 2:
        System.out.println("2");
        break;
    default:
        break;
}
scala:
val firstArg = if (args.length > 0) args(0) else ""
firstArg match {
    case "salt" => println("pepper")
    case "chips" => println("salsa")
    case "eggs" => println("bacon")
    case _ => println("huh?")
}

3.Sử dụng break trong vòng Loop

break hay continue chúng ta đã quen thuộc khi làm việc với java, nhưng với scala đã có những ý kiến trái chiều về việc có nên dùng từ khóa break và continue hay không, vì các developer hoàn toàn có thể control được luồng chạy lúc nào cần break hay continue thông qua logic if else. Dù vậy đã lâu chúng ta quen thuộc với việc dùng break và continue thì scala vẫn hỗ trợ cho việc sử dụng break cụ thể như sau:

vd:

java:
    String[] args = { "a", "-c", "b.scala" };
    int i = 0;
    boolean foundIt = false;
    while (i < args.length) {
        if (args[i].startsWith("-")) {
            i = i + 1;
            continue;
        }
        if (args[i].endsWith(".scala")) {
            foundIt = true;
            break;
        }
        i = i + 1;
    }

Với scala dùng break cần phải khái báo trong block với từ khóa breakable, chúng ta hiểu nôm na là nơi có thể break được =))

scala:
package com.scala

import java.io.BufferedReader
import java.io.InputStreamReader
import scala.util.control.Breaks._

object TestApplication {
  def main(args: Array[String]): Unit = {
    val in = new BufferedReader(new InputStreamReader(System.in))
    breakable {
      while (true) {
        println("? ")
        if (in.readLine() == "") break
      }
    }
  }
}

4.Variable scope

Những tưởng scope của từng biến chúng ta luôn tự tin là đã nắm rõ, cũng đúng là như vậy vì scope variable này không có gi khó hiểu, nhưng có một điểm chú ý mình muốn nói tới khi sử dụng scala đó là biến variable local có thể trùng tên với một biến khác ở ngoài block trong cùng một method, nghe rất mâu thuẫn với những gi chúng đã biết về việc khai báo biến trên java phải không ạ.

vd:

java:
public void show() {
    int number = 0;
    {
        int number = 1; //error compile
    }
}
scala:
  def show() {
    val a = 1;
    {
      val a = 2 // Compiles just fine
      println(a)
    }
    println(a)
  }
  ouput:
  2
  1

5.kết Luận

Tài liệu mình theo đọc là cuốn sách này http://ccfit.nsu.ru/~den/Scala/programming_in_scala_2nd.pdf cuốn nay hay và mình rất thích các bạn tìm đọc nhé sẽ rất dễ hiểu ?

Mình xin dừng tại đây để dành phần sau lại tiếp tục chia sẻ tới các bạn =)) Cảm ơn các bạn đã đọc bài chia sẻ của mình, hạn gặp lại nhé. ^^

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration