著者:Magic Good出典:HangSengLIGHTクラウドコミュニティ
Scalaシリーズ:
序文
ビッグデータフレームワークSparkやFinkなどのビッグデータオープンソースフレームワークの基本原則を深く学ぶには、Scalaプログラミング言語を学ぶ必要があります。この記事では、Scalaの高度な構文を要約し、例を使用してScala構文をすばやく学習し、関連するオープンソースフレームワークのソースコードを理解するのに役立ちます。
Scalaでのオブジェクト指向プログラミング
Scalaオブジェクト指向とJavaは、どちらも単一継承であるという点で似ています。クラスはClassで装飾され、オブジェクトはObjectで装飾され、クラスはオブジェクトの抽象化であり、オブジェクトはクラスのインスタンスです。
アクセス修飾子
Scalaのアクセス修飾子は基本的にそれぞれJavaのものと同じです:public
、、、そしてデフォルトでは、指定されていないオブジェクトのアクセスレベルはすべてprotected
です。private
public
公衆
public
変更されたメンバーはどこでも直接使用できます。次の例を理解してください。
class Outer {
class Inner {
// 默认就是 public 修饰
def fun() {
println("fun do") }
class InnerMore {
fun() // 可以调用
}
}
}
保護
protected
メンバーが定義されているクラスのサブクラスでのみ保護されたメンバーへのアクセスを許可します。次の例を理解してください。
class Outer {
protected def fun() {println("fun do")}
}
class Inner extends Outer {
fun() // 只能子类访问
}
プライベート
private
メンバー定義を含むクラスまたはオブジェクト内にのみ表示されます。次の例を理解してください。
class Outer{
class Inner{
private def fun(){
println("fun do")
}
class InnerMost{
fun() // 可以调用
}
}
}
親切
Scalaのクラスは、オブジェクトを作成するための青写真です。オブジェクトには、メソッド、定数、変数、型、オブジェクト、特性、クラスが含まれ、これらをまとめてメンバーと呼びます。最も単純なクラス定義はキーワードclass
+識別子であり、クラス名の最初の文字は大文字にする必要があります。
// 定义类
class Person
// 通过类创建一个对象
val jack = new Person
もちろん、実際の開発では、このような単純なクラスは一般に定義されておらず、通常はコンストラクターやメンバーなどがあります。
// 类的构造器是在传参就定义,数据类型不能省略
class Point(var _x : Int = 0, var _y : Int = 0) {
private val bound = 100
// getter 方法
def x = _x
// setter 方法,后面加上了 _=
def x_=(newValue: Int): Unit = {
if (newValue < bound) _x = newValue else printOutBoundWarn
}
def y = _y
def y_=(newValue: Int): Unit = {
if (newValue < bound) _y = newValue else printOutBoundWarn
}
private def printOutBoundWarn = println("Warning: Out of bound")
// toString覆盖了AnyRef中的toString方法,所以用了override关键字标记
override def toString: String =
s"($x, $y)"
}
object ObjectClass {
def main(args : Array[String]): Unit = {
// 关键字new被用于创建类的实例
var point : Point = new Point
point.x = 100
println(point.toString)
}
}
setterメソッドの特別な構文に注意してください。このメソッドは、getterメソッドの後に_ =を追加し、その後にパラメーターを追加します。
特性
トレイトは、クラス間でプログラムインターフェイスとフィールドを共有するために使用されます。
トレイトはJava8インターフェースに似ており、クラスとオブジェクト(オブジェクト)はトレイトを拡張できますが、トレイトをインスタンス化できないため、トレイトにはパラメーターがありません。
特性、キーワードtrait
+識別子の簡単な定義:
trait HairColor
より深く理解するためtrait
にIterator
、例。
// 定义 Iterator 特质,A 为泛型
trait Iterator[A] {
def hasNext: Boolean
def next(): A
}
拡張機能
trait Iterator [A]
には、タイプAと実装メソッドhasNext
およびが必要next
です。
// 定义一个类继承 Iterator 特质,并扩展其成员方法
class IntIterator(to: Int) extends Iterator[Int] {
private var current = 0
override def hasNext: Boolean = current < to
override def next(): Int = {
if (hasNext) {
val t = current
current += 1
t
} else 0
}
}
val iterator = new IntIterator(10)
iterator.next() // returns 0
iterator.next() // returns 1
// 定义 Iterator 特质类型集合,但实现需要其子类
val list = List.empty[Iterator]
シングルトンオブジェクト
Scalaのシングルトンオブジェクトは、インスタンスが1つだけある特別なクラスです。これはレイジー変数であり、シングルトンオブジェクトは、初めて使用されるときにレイジーに作成されます。
オブジェクトがクラスまたはメソッドで定義されている場合、シングルトンオブジェクトはレイジー変数のように動作します。
シングルトンを定義するための構文は、クラスを定義するための構文と似ています。
object User
シングルトンオブジェクトの定義は、他の場所で再利用できます。Javaでは静的オブジェクトとして理解できます。
object Logger {
def info(message: String): Unit = println(s"INFO: $message")
}
class Test {
info("Created projects")
}
var test = new Test // Prints "INFO: Created projects"
コンパニオンオブジェクト
Scalaのコンパニオンオブジェクトは、シングルトンオブジェクトがクラスと名前を共有する場合です。同じ理由で、このクラスはシングルトンオブジェクトのコンパニオンクラスであると言われています。クラスとそのコンパニオンオブジェクトは、互いのプライベートメンバーにアクセスできます。
コンパニオンオブジェクトを使用して、インスタンス化されたオブジェクトとは無関係にコンパニオンクラスに存在するメンバー変数またはメソッドを定義します。
static
Javaのメンバーは、Scalaのコンパニオンオブジェクトの通常のメンバーに対応します。
コンパニオンオブジェクトの定義の例:
import scala.math._
class Circle(radius: Double) {
def area: Double = calculateArea(radius)
}
// 对象可以直接访问类的私有成员 radius
object Circle {
private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)
}
val circle = Circle(5.0)
circle.area
注:クラスとそのコンパニオンオブジェクトは、同じソースファイルで定義する必要があります。REPLでクラスとそのコンパニオンオブジェクトを定義する必要がある場合は、同じ行でそれらを定義するか、:pasteモードに入る必要があります。
ジェネリッククラス
クラスが定義されていて、入力パラメータの型が確認できない場合は、パラメータの型を一時的に表すためにジェネリッククラスが必要であり、この型がジェネリック型です。ジェネリッククラスは角括弧[]
を使用して型パラメーターを受け入れます。慣例では、パラメーターIDA
としてますが、任意のパラメーター名を使用できます。
class Car[A] {
private var passager: List[A] = Nil
}
// 实例后传入参数只能为实例的入参
var car = new Carp[Int]
ジェネリック型のサブタイプは導電性ではありません。
Scalaパターンマッチング
Javaのswitch
ステートメント、パラメーターの一致に従って対応する結果を返します。次の場合を理解してください。
object ModeMatch {
def main(args: Array[String]): Unit = {
// 模式匹配案例
val x = 2;
println(mode(x)); // b
}
// 定义匹配规制,可以理解策略匹配
def mode(t: Int): String = t match {
case 1 => "a" // 如果输入参数为 1, 则匹配本条件
case 2 => "b"
case _ => "c" // 如果以上条件都不匹配,则返回本条
}
}
ScalaファイルI/O
Scalaでのファイルの読み取りと書き込みには、通常、JavaのI/Oクラスが使用されます。java.io.File
入力の読み取り
キーボードからのユーザー入力を読み取る必要がある場合は、次の例を参照してください。
import scala.io.Source
object FileIo {
def main(args : Array[String]): Unit = {
// 读取文件写入的内容
var reader = StdIn.readLine();
println("输入的内容为:" + reader)
}
}
ファイル書き込み
単にファイルに書き込む必要がある場合は、次の場合を参照できます。
import java.io._
object FileIo {
def main(args : Array[String]): Unit = {
// 新建一个文件流写入对象
val writer = new PrintWriter(new File("scala.txt" ))
// 向文件中写入内容
writer.write("文件IO")
writer.close()
}
}
プログラムの実行後、新しく作成されたファイルを表示できます。
ファイルの読み取り
Scala scala.io.Source
クラス、ファイルの内容を直接読み取ることができ、次の例を理解できます。
import scala.io.Source
object FileIo {
def main(args : Array[String]): Unit = {
// 读取文件写入的内容
Source.fromFile("scala.txt" ).foreach{
print
}
}
}
例外処理
return
Scalaでの例外処理は、通過しないように実行プログラムを直接中断するために、基本的にJavaと同じです。次の場合を理解してください。
import java.io.{FileNotFoundException, FileReader, IOException}
object OutException {
def main(args: Array[String]): Unit = {
try {
val file = new FileReader("scala.txt")
println("file :" + file)
} catch { // 如果 try 中语句块执行异常,则会进行捕捉进行以下操作
// case 用来匹配异常错误类型
case ex: FileNotFoundException => {
println("文件未找到异常")
}
case ex: IOException => {
println("IO 异常")
}
} finally { // finally 不管 try 中的程序是否异常,都会执行
println("程序执行结束")
}
}
}
要約する
この記事では、Scalaのオブジェクト指向知識などの高度な知識の紹介をまとめています。理解したら、ビッグデータフレームワークの入門学習を開始できます。Scalaに非常に興味がある場合は、Scalaの公式Webサイトにアクセスして学習できます。 API。最後に、Scalaの関連知識が共有されます。これ。