学習ノート——Scala集合、モードマッチングとクラス(2)

43397 ワード

本文は前のscalaの勉強に続いて書きました.
五、配列
配列の作成
     /**
     *         :
     * 1.new Array[String](3)
     * 2.  Array
     */
    
    //     Int    3   
    val arr1 = new Array[Int](3)
    //  String      ,    
    val arr2 = Array[String]("s100","s200","s300")
    //  
    arr1(0) = 100
    arr1(1) = 200
    arr1(2) = 300

次に、2 D配列の作成と遍歴を示します.
    /**
     *          
     */
    val arr3 = new Array[Array[String]](3)
    arr3(0)=Array("1","2","3")
    arr3(1)=Array("4","5","6")
    arr3(2)=Array("7","8","9")
    for(i <- 0 until arr3.length){
      for(j <- 0 until arr3(i).length){
        print(arr3(i)(j)+"	")
      }
      println()
    }1	2	3	
    4	5	6	
    7	8	9
    var count = 0
    for(arr <- arr3 ;i <- arr){
      if(count%3 == 0){
        println()
      }
      print(i+"	")
      count +=1 
    }
    
    arr3.foreach { arr  => {
      arr.foreach { println }
    }}
    
    
    val arr4 = Array[Array[Int]](Array(1,2,3),Array(4,5,6))
    arr4.foreach { arr => {
      arr.foreach(i => {
        println(i)
      })
    }}1
	2
	3
	4
	5
	6
    println("-------")
    for(arr <- arr4;i <- arr){
      println(i)
    }1
	2
	3
	4
	5
	6

かへんちょうはいれつ
  /**
  *          
  */

	val arr = ArrayBuffer[String]("a","b","c")
	arr.append("hello","scala")//      
	arr.+=("end")//       
	arr.+=:("start")//       
	arr.foreach(println)
  :
	start
	a
	b
	c
	hello
	scala
	end

六、リストリスト
コレクションの作成、コレクションの遍歴
	//  
    val list = List(1,2,3,4,5)
    
    //  
	list.foreach ( println)
    //filter
    val list1  = list.filter ( x => x>3 )
    list1.foreach { println}
    
    //count
    val value = list1.count (x => x>3println(value)
    
    //map
    val nameList = List(
    		"hello scala",
    		"hello spark",
    		"hello hadoop"
        )
    val mapResult:List[Array[String]] = nameList.map{ x => x.split(" ") }
    mapResult.foreach(println)    
    
    //flatmap
    val flatMapResult : List[String] = nameList.flatMap{ x => x.split(" ") }
    flatMapResult.foreach ( println )

filter:フィルタ要素count:条件を満たす要素の個数mapを計算する:要素を操作するflatmap:扁平にして、先にmapからflat
七、集合セット
	//   
    val set1 = Set(1,2,3,4,4)
    val set2 = Set(1,2,5)
    //  
    //  :set     
    set1.foreach { print}
   for(s <- set1){
      print(s)
    }
    print("*******")1234
    1234
    
   /**
    *     
    */    
   //  
   val set3 = set1.intersect(set2)
   set3.foreach{println}
   val set4 = set1.&(set2)
   set4.foreach{println}
   println("*******")
   //  
   set1.diff(set2).foreach { println }
   set1.&~(set2).foreach { println }
   //  
   set1.subsetOf(set2)
   
   //   
   println(set1.max)
   //   
   println(set1.min)
   println("****")
   
   //    ,list
   set1.toArray.foreach{println}
   println("****")
   set1.toList.foreach{println}
   
   //mkString
   println(set1.mkString)
   println(set1.mkString("\t"))1234
   1	2	3	4

配列への変換:toListから文字列への変換:mkString
八、map
九、ユニットtuple
メタグループ定義
リストと同様に、リストとは異なり、メタグループには異なるタイプの要素が含まれます.メタグループの値は、単一の値をカッコに含めることで構成されます.
メタグループの作成と使用
//  ,    22 
    val tuple = new Tuple1(1)
    val tuple2 = Tuple2("zhangsan",2)
    val tuple3 = Tuple3(1,2,3)
    val tuple4 = (1,2,3,4)
    val tuple18 = Tuple18(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
    val tuple22 = new Tuple22(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)

    //  
    println(tuple2._1 + "\t"+tuple2._2)

注意:tupleは最大22個のパラメータをサポートします
メタグループの遍歴
//  
    val tupleIterator = tuple22.productIterator
    while(tupleIterator.hasNext){
      println(tupleIterator.next())
    }

swap、toStringメソッド
/**
     *   
     */
    //  ,      
    println(tuple2.swap)
    
    //toString
    println(tuple3.toString())

十、特徴Trait
概念の理解
Traitはjavaのインタフェースに相当し、インタフェースとは異なり、属性とメソッドの実装を定義することもできます.一般にscalaのクラスは複数のTraitを継承することができ,結果的に多重継承が実現される.trait定義はクラスと似ていますが、使用するキーワードはtraitです.
メソッドの例
traitではパラメータを送信できません
trait Read {
  val readType = "Read"
  val gender = "m"
  def read(name:String){
	println(name+" is reading")
  }
}

trait Listen {
  val listenType = "Listen"
  val gender = "m"
  def listen(name:String){
	println(name + " is listenning")
  }
}

class Person() extends Read with Listen{
  override val gender = "f"
}

object test {
  def main(args: Array[String]): Unit = {
    val person = new Person()
    person.read("zhangsan")
    person.listen("lisi")
    println(person.listenType)
    println(person.readType)
    println(person.gender)
    
  }
}
  :
zhangsan is reading
lisi is listenning
Listen
Read
f

十一、パターンマッチング
概念の理解
scalaは強力なモードマッチングメカニズムを提供し,応用が非常に広範である.1つのモードマッチングには、キーワードcaseで開始する一連のスタンバイオプションが含まれています.各スタンバイオプションには、1つのモードと1つ以上の式=>が含まれており、モードと式が分離されています.
コードと注意点
モードマッチングは、値をマッチングするだけでなく、タイプを上から下に順番にマッチングすることもでき、マッチングしないと下にマッチングしないとcase_にマッチングします.default matchの一番外側に相当する
object Lesson_Match {
  def main(args: Array[String]): Unit = {
    val tuple = Tuple6(1,2,3f,4,"abc",55d)
    val tupleIterator = tuple.productIterator
    while(tupleIterator.hasNext){
      matchTest(tupleIterator.next())
    }
    
  }
  /**
 *    :
 * 1.           ,       
 * 2.     ,            ,         
 * 3.     ,      ,     case _ ,   default
   */
  def matchTest(x:Any) ={
    x match {
      case x:Int=> println("type is Int")
      case 1 => println("result is 1")
      case 2 => println("result is 2")
      case 3=> println("result is 3")
      case 4 => println("result is 4")
      case x:String => println("type is String")
//      case x :Double => println("type is Double")
      case _ => println("no match")
    }
  }
  
}

十二、サンプル類case classes
概念の理解
caseキーワードを使用したクラス定義はサンプルクラス(case classes)であり、サンプルクラスは特殊なクラスである.クラス構築パラメータを実装するgetterメソッド(構築パラメータはデフォルトでvalとして宣言されます)は、構築パラメータがvarタイプとして宣言されている場合、setterメソッドとgetterメソッドを実装します.
  • サンプルクラスのデフォルトでは、toString、equals、copy、hashCodeなどの方法が実現されます.
  • サンプルクラスはnewでもnewでもnew
  • でもなくてもよい
    メソッドの例
    case class Person1(name:String,age:Int)
    
    object Lesson_CaseClass {
      def main(args: Array[String]): Unit = {
        val p1 = new Person1("zhangsan",10)
        val p2 = Person1("lisi",20)
        val p3 = Person1("wangwu",30)
        
        val list = List(p1,p2,p3)
        list.foreach { x => {
          x match {
            case Person1("zhangsan",10) => println("zhangsan")
            case Person1("lisi",20) => println("lisi")
            case _ => println("no match")
          }
        } }
        
      }
    }
      :
    zhangsan
    lisi
    no match
    

    十三、暗黙変換
    暗黙変換はScalaコンパイラがタイプマッチングを行う場合、適切なタイプが見つからない場合、暗黙変換はコンパイラに作用範囲内で自動的に適切なタイプを導出させる
    暗黙値と暗黙パラメータ
    暗黙値とは、パラメータを定義する前にimplicitを付けることです.暗黙的パラメータとは、メソッドを定義する際に、メソッドの一部のパラメータがimplicitによって修飾されることを意味します.暗黙的な変換の役割は、メソッドを呼び出すと、メソッド内の暗黙的なパラメータを手動で入力する必要がなく、Scalaは自動的に役割ドメインの範囲内で暗黙的な値を探して自動的に入力します.暗黙値と暗黙パラメータの注意:1).同じタイプのパラメータの暗黙的な値は、役割ドメイン内で一度しか現れず、同じ役割ドメイン内で複数のタイプのような暗黙的な値を定義することはできません.2). implicitキーワードは暗黙的パラメータ定義の先頭3)に置く必要がある.1つの方法は、1つのパラメータが暗黙的に変換されたパラメータである場合にのみ、implicitキーワード修飾のパラメータを直接定義することができ、呼び出し時に直接タイプがパラメータに入らないように作成すればよい.4). 1つの方法複数のパラメータがある場合、一部のパラメータの暗黙的な変換を実現するには、コリー化を使用する必要があります.暗黙的なキーワードは後ろに表示され、1回しか表示されません.
    暗黙変換関数
    暗黙変換関数は、キーワードimplicitを使用して修飾する方法です.Scalaが実行されると、A型変数がmethod()というメソッドを呼び出すと、A型の変数にはmethod()メソッドがなく、B型にはこのmethod()メソッドがあり、A型をB型に変換する暗黙変換関数があるかどうかを役割ドメインで探し、暗黙変換関数がある場合、A型はmethod()というメソッドを呼び出すことができます.暗黙変換関数注意:暗黙変換関数は、関数のパラメータタイプと戻りタイプにのみ関係し、関数名には関係ありません.したがって、役割ドメイン内に同じパラメータタイプと戻りタイプの異なる名前の暗黙変換関数を持つことはできません.
    暗黙クラス
    implicitキーワードで修飾されたクラスは暗黙的なクラスです.変数Aにメソッドまたは変数がない場合、この変数Aがメソッドまたは変数を呼び出すことができる場合は、暗黙クラスを定義し、暗黙クラスでこれらのメソッドまたは変数を定義し、暗黙クラスにAを入力すればよい.暗黙のクラス注意:1).暗黙的なクラスは、クラス、パッケージオブジェクト、伴生オブジェクトに定義する必要があります.2).暗黙クラスの構造には、同じクラス、パッケージオブジェクト、伴生オブジェクトに同じタイプの構造の暗黙クラスが表示されないパラメータが1つしかない必要があります.
    十四、Akka
    AkkaはScalaで作成されたライブラリであり、フォールトトレランスを簡単に作成するための、高い伸縮性のJavaとScalaのActorモデルアプリケーションであり、下位実装はActorであり、Akkaは開発ライブラリと実行環境であり、高同時、分散、フォールトトレランス、イベント駆動のJVMベースのアプリケーションを構築するために使用することができる.高同時性の分散アプリケーションの構築を容易にします.spark1.6バージョン以前には,spark分散ノード間のメッセージングにAkka,下位層すなわちactorが用いられていた.1.6以降に使用されるnetty転送.