【Scala】Scala ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/03/10/193805

の続き。

Scalaで開発することになりそうなので
予習してたら、Javaと比べて、結構、変わっていた。
まずは、簡単な文法から整理していく

なお、以下のサイトで動作確認しながらやるといいかも。

https://scastie.scala-lang.org/CEpZy3v4Taa0MCStp3LCYg

目次

【0】Scala
 1)特徴
【1】変数定義
 1)データ型
【2】条件分岐
 1)if文
 2)三項演算子
 3)match文
【3】ループ

【0】Scala

 2001年に、Javaのジェネリックスの共同設計者と知られる
スイス連邦工科大学ローザンヌ校(École Polytechnique Fédérale de Lausanne; EPFL)
のマーティン・オーダスキー教授によって設計されたプログラム言語。

1)特徴

* Java仮想マシン(JVM; Java Virtual Machine)上で動作
* オブジェクト指向プログラミングと関数型プログラミング
 の両方を実行できるハイブリッド言語

【1】変数定義

* val / var がある

https://qiita.com/yagiyuki/items/1455256746d84e52f9fd

val

* 再入不可
* 定数
 => 普段は、こっちを使うようにする

var

* 再入可能
* Javaの変数定義と同じ

サンプル

object  Hello {
  def main(args: Array[String]): Unit = {
    val val1 = "Hello"
    // val val1: String = "Hello"
    var val2 = "World"

    // Error: Reassignment to val val1
    // val1 = val1 + ","
    val2 = val2 + "!!"

    println(val1 + " " + val2)
  }
}

1)データ型

* Boolean や Int などすべての値がオブジェクトとして定義
 => まずは、以下のサイトの階層図をみた方がいい

https://docs.scala-lang.org/ja/tour/unified-types.html

* データ型については、以下のサイト参照。

https://qiita.com/msano/items/151a6402605df071a7de

データ型 説明 メモ
Any 全てのデータ型のスーパータイプ
AnyVal 値型(Int,Boolean, Charなど)のスーパータイプ
Unit 何も返すものがないことを表す方(Javaのvoid)
AnyRef 参照型(String, List, Null)のスーパータイプ JavaのObjectに近い(※)
Null Javaのnullの型
Nothing 全ての型のサブタイプ

※ Any/AnyRef

* Anyは、Javaでも当てはまらない

https://stackoverflow.com/questions/23892167/convert-scala-any-to-java-object

java.lang.Object is equivalent to AnyRef in Scala, not Any. 

 => 確かに、ScalaからJavaのクラス(java.util.Properties)を使おうとした際に
  Any だとコンパイルエラーになったので、わざわざ AnyRef にして対応した

【2】条件分岐

* 注目すべき Java との違いは、
 switch文の代わりに、match文が増えた

https://qiita.com/kaysquare1231/items/19b1bf58e8bb36f605c4

1)if文

* if/else if/else と Java と変わらない

2)三項演算子

val weight: Int = 95
val result = if (weight <= 100) "OK" else "Bad"
println("Result: " + result)

3)match文

val value = 2
value match {
  case 1 => println("Hello")
  case 2 => println("World")
  case _ => println("Bye...")
}

【3】ループ

* 以下の関連記事を参照のこと
 => break 文がデフォルトではない、、、

Scala ~ 基本編 / 繰り返し ~
https://dk521123.hatenablog.com/entry/2023/01/24/000000

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 環境構築編 / IntelliJ IDEA in WSL ~
https://dk521123.hatenablog.com/entry/2023/06/10/034839
Scala ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2023/01/07/000000
Scala ~ 基本編 / 繰り返し ~
https://dk521123.hatenablog.com/entry/2023/01/24/000000
Scala ~ break / continue ~
https://dk521123.hatenablog.com/entry/2023/10/14/011736
Scala ~ for yield ~
https://dk521123.hatenablog.com/entry/2023/09/06/232921
Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala ~ 基本編 / Either型 ~
https://dk521123.hatenablog.com/entry/2023/08/02/132315
Scala ~ 基本編 / 関数 ~
https://dk521123.hatenablog.com/entry/2023/10/09/232838
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala ~ 基本編 / クラス ~
https://dk521123.hatenablog.com/entry/2023/03/14/000857
Scala ~ 基本編 / トレイト ~
https://dk521123.hatenablog.com/entry/2023/09/10/204016
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ コレクションで使えるメソッド ~
https://dk521123.hatenablog.com/entry/2023/09/07/223422
Scala ~ mutable collection ~
https://dk521123.hatenablog.com/entry/2024/07/09/223730
Scala ~ 基本編 / 日付・日時 ~
https://dk521123.hatenablog.com/entry/2023/03/08/000000
Scala ~ Joda-Time ~
https://dk521123.hatenablog.com/entry/2024/07/10/001348
Scala ~ 基本編 / 例外処理 ~
https://dk521123.hatenablog.com/entry/2023/10/05/000135
Scala ~ 基本編 / パターンマッチング ~
https://dk521123.hatenablog.com/entry/2023/06/06/233614
Scala ~ 基本編 / 正規表現
https://dk521123.hatenablog.com/entry/2023/03/18/034704
Scala ~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala ~ 基本編 / カリー化 ~
https://dk521123.hatenablog.com/entry/2023/09/04/231709
ScalaEnum
https://dk521123.hatenablog.com/entry/2023/01/05/000000
Scala ~ ファイル名・パスの扱い ~
https://dk521123.hatenablog.com/entry/2023/03/11/000000
Scala ~ ファイルハンドリング ~
https://dk521123.hatenablog.com/entry/2023/01/03/000000
Scala ~ ファイルの読み書き ~
https://dk521123.hatenablog.com/entry/2023/04/07/000000
ScalaYAML
https://dk521123.hatenablog.com/entry/2023/03/16/012034
ScalaJSON
https://dk521123.hatenablog.com/entry/2023/04/04/000733
Scala ~ TOML ~
https://dk521123.hatenablog.com/entry/2023/10/08/232146
Scala ~ Resources ~
https://dk521123.hatenablog.com/entry/2024/05/08/233755
Scala ~ Logging / SLF4J ~
https://dk521123.hatenablog.com/entry/2023/06/27/230840
Scala ~ 非同期 / Future ~
https://dk521123.hatenablog.com/entry/2023/04/30/000000
Scala ~ 部分関数 / PartialFunction ~
https://dk521123.hatenablog.com/entry/2023/09/08/235546
Scala ~ 乱数 / ランダム ~
https://dk521123.hatenablog.com/entry/2023/10/11/103948
ScalaJDBC / DB接続 ~
https://dk521123.hatenablog.com/entry/2023/03/26/000950
ScalaAWS SDK
https://dk521123.hatenablog.com/entry/2023/03/24/211033
ScalaAWS SDK / S3サンプル ~
https://dk521123.hatenablog.com/entry/2023/04/01/002005
ScalaAWS SDK / Secrets Managerサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/03/012600
ScalaAWS SDK / SESサンプル ~
https://dk521123.hatenablog.com/entry/2023/04/16/003338
ScalaApache Kafka / Producer ~
https://dk521123.hatenablog.com/entry/2023/04/27/235703
ScalaApache Kafka / Consumer ~
https://dk521123.hatenablog.com/entry/2023/04/28/014737
Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450
SBT ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2024/01/13/002637
SBT ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/22/000000
SBT ~ 基本編 / build.sbt ~
https://dk521123.hatenablog.com/entry/2023/01/27/000000
SBT ~ 基本編 / sbtコマンド ~
https://dk521123.hatenablog.com/entry/2023/01/26/000000
SBT ~ sbtプラグイン
https://dk521123.hatenablog.com/entry/2023/01/25/000000
SBT ~ JAR作成/実行 ~
https://dk521123.hatenablog.com/entry/2023/10/12/200450
SBT ~ 引数設定の仕方 ~
https://dk521123.hatenablog.com/entry/2023/08/21/000000
SBT ~ 設定の切替 ~
https://dk521123.hatenablog.com/entry/2023/08/28/165323
SBT ~ リポジトリ先を変更・追加するには ~
https://dk521123.hatenablog.com/entry/2024/01/12/191252
Scala ~ テスティングフレームワーク
https://dk521123.hatenablog.com/entry/2024/06/07/183708
ScalaTest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/27/001306
ScalaTest ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/03/28/003906
ScalaTest ~ with ScalaCheck ~
https://dk521123.hatenablog.com/entry/2023/03/29/000014
ScalaTest ~ with Mockito ~
https://dk521123.hatenablog.com/entry/2023/03/31/002830
ScalaTest ~ ScalaMock ~
https://dk521123.hatenablog.com/entry/2024/06/12/215306
ScalaTest ~ with Coverage ~
https://dk521123.hatenablog.com/entry/2023/08/07/222945
specs2 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/06/08/122708
specs2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/06/09/221005
SDKMAN ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/08/13/000000
Spark ~ FutureAction ~
https://dk521123.hatenablog.com/entry/2023/04/18/234214