[Scala 入門] Scala のダウンロードとインストール (Windows) および最初の scala プロジェクトを作成するためのアイデア - Programmer Soughtに移動してください。
目次
[ケース: コンパニオン オブジェクト、val はオブジェクトを介して属性を変更します]
【事例:コンストラクタを書き換え、メソッドをオブジェクトに適用】
1.スカラ
- Scala は JVM に基づいており、Java と完全に互換性があり、クロスプラットフォーム、優れた実行、便利なガベージ コレクションなどの特徴もあります。
- Scala は純粋なオブジェクト指向言語です。
- Scala は関数型プログラミング言語です。
- Scala は、コレクション型のデータ処理を非常によくサポートしています
Spark の最下層は Scla で記述されており、Spark を深く学ぶには Scala を習得する必要があります。
2. Scala の基本文法
注:
- scala の各行の後にセミコロンの自動推論メカニズムがあり、「;」を明示的に記述する必要はありません。
- scala では、クラス名の最初の文字を大文字にし、メソッドの最初の文字を小文字にすることをお勧めします。また、クラスとメソッドの命名は、hump 命名法に準拠することをお勧めします。
2.1 コメントと識別子の指定
(1) 注:
// 1.单行注释
/* */ 2. 多行注释
/** 3. 文档注释
*
**/
(2) 識別子の命名規則:
- C/C++/Java のように、アルファベットのアンダースコアの後に英数字のアンダースコアが続きます。
- 演算子であり、(+-*/#! など) のみを含むものも有効な識別子です。このように使用すると、奇妙な利点はありますか?その答えは、Zentraedi と同じくらい柔軟な演算子のオーバーロードです。
- 39 個の Scala キーワードの 1 つと同じ名前であっても、バッククォートで囲まれた任意の文字列。
var _abc:String = "hello"
val -+/%# = 10
val `if` = 10
println(_abc)
println(-+/%#)
println(`if`)
キーワード:
package import class obejct trait extends with type for
private protected abstract sealed final implicit lazy override
try catch finlly throw
if else match case do while for return yield
def var val
this super
new
true false null
- Java にないキーワードには次のものがあります。
object trait with implicit match yield def val var
弦:
- タイプ:
String
+
繋がり*
文字列の乗算、文字列を複数回コピーするprintf
フォーマットされた出力- 文字列補間:
s"xxx${varname}"
プレフィックスs
テンプレート文字列、プレフィックスf
フォーマット テンプレート文字列、$
変数値の取得、%
その後にフォーマット文字列。 - Raw string:
raw"rawstringcontents${var}"
の後に続く書式設定文字列は考慮されません。 - 複数行の文字列:
""" """
. - 出力:
print printf println ...
val name: String = "Pyrrha" + " " + "Nikos" // +号拼接字符串
val age = 17
println((name + " ") * 3) // 将一个字符串复制多次进行拼接
printf("%s : dead in %d\n", name, age) // printf:前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串
print(s"$name : dead in ${age}") // 字符串插值:前缀s模板字符串,通过$获取变量值
val power = 98.9072
println(f" : power ${power}%.2f.") // 取小数后2位
2.2 変数と定数
Scala には 2 種類の変数があります。
- キーワードvarで宣言された変数には変数値があります。
- キーワードvalで宣言された変数は定数とも呼ばれ、その値は不変です。
注:
- 変数の値から変数の型を推測できる場合は、型宣言を省略できます。
- 変数は明示的に初期化する必要があります。
- 通常、デフォルトは val 型の変数です。
【ケース:変数の宣言と代入】
object HelloWorld {
def main(args: Array[String]): Unit = {
// 定义方法 main == def 方法名(参数名: 参数类型):返回值 ={}
println("hello world")
//1. 类型推导; 声明变量时, 类型可以忽略, 编译器会自动推导;
var a1 = 10;
var a2: Int = 10;
var b3 = "areusb?";
val c5 = false;
//2. 强类型语言; 变量/常量的数据类型确定后, 就不能再修改
var e3: Int = 250;
e3 = "feswgf"; // 编译器不会对此句报错, 执行时才会报错 type mismatch
//3. 声明变量时必须有初始值,否则报错;
var e4: Int;
//4. var可变, va不可变
var f4 = 6;
f4 = 9;
val f5 = 100;
f5 = 200; // 编译器当场报错;
}
}
コンソールに結果を出力します。
2.3 オブジェクト
scala におけるオブジェクトは、java におけるツール クラスに相当するシングルトン オブジェクトであり、静的メソッドを定義するクラスと見なすことができます。
同じファイル内でオブジェクト object とクラス class の名前が同じである場合、このオブジェクトはこのクラスのコンパニオン オブジェクトであり、このクラスはこのオブジェクトのコンパニオン クラスです。プライベート変数は相互にアクセスできます。
[ケース: コンパニオン オブジェクト、val はオブジェクトを介して属性を変更します]
- オブジェクトはパラメーターを渡すことができません。
- scala の class クラスはデフォルトでパラメーターを渡すことができ、デフォルトのパラメーター受け渡しはデフォルトのコンストラクターです。コンストラクターを書き換えるときは、既定のコンストラクターを呼び出す必要があります。
- class クラスの属性には、デフォルトで setter メソッドと getter メソッドがあります。
package test
class Student(name: String, var age: Int) {
def printInfo(): Unit = {
println(name + " " + age + " " + Student.school)
}
}
// 引入 object 伴生对象/单例对象,所有的私有属性都可以互相访问
object Student {
val school: String = "atguigu"
def main(args: Array[String]): Unit = {
val alice = new Student(name = "alice", age = 19)
alice.age = 24
alice.printInfo()
}
}
コンソールに結果を出力します。
【事例:コンストラクタを書き換え、オブジェクトにメソッドを適用】
- scala の class クラスはデフォルトでパラメーターを渡すことができ、デフォルトのパラメーター受け渡しはデフォルトのコンストラクターです。コンストラクターを書き換えるときは、既定のコンストラクターを呼び出す必要があります。
-
object を使うときは new を使わない; class を使うときは new が必要で、new のときはクラスで実行されないメソッド (construction を除く) を除いてすべてが実行される;
- オブジェクトの apply メソッド: パラメータをオブジェクトに渡すことはできません. オブジェクトを作成するときに、パラメータが渡されると、オブジェクト内の対応する数のパラメータを持つ apply メソッドが自動的に検出されます。
package com.yt.test
class Person(xname: String, xage: Int) {
val name = xname
var age = xage
var gender = 'M'
println("----------- Person Class -----------") // new时,class中除了方法不执行(不包括构造),其他都执行
def this(yname: String, yage: Int, ygender: Char) {
this(yname, yage) // 类中重写构造时,构造中第一行要调用默认的构造函数
this.gender = ygender
}
def sayName() = {
println("sayName:", ClassAndObj.name) // 调用object静态属性
}
println("************ Person Class ************")
}
object ClassAndObj {
println("----------- ClassAndObj object -----------")
val name = "wangwu" // object静态属性,相当于java的工具类
def apply(s: String, age: Int) = {
println("name is " + s + ",age" + age)
}
def main(args: Array[String]): Unit = {
val p1 = new Person("zhangsan", 19)
val p2 = new Person("zhangsan", 19, 'F')
p1.age = 200
println(p1.name, p1.age)
p1.sayName()
println(p2.name, p2.age, p2.gender)
ClassAndObj("lisi", 500)
}
}
コンソールに結果を出力します。