主頁 > 軟體設計 > Scala 必知必會

Scala 必知必會

2021-09-28 08:16:37 軟體設計

文章目錄

  • 入門
      • 概述
      • 安裝
      • Java VS Scala
      • val 和 var
      • 基本資料型別
      • lazy在Scala中的應用
      • 開發工具IDEA
      • Maven
  • 函式
      • 方法定義
      • 默認引數
      • 命名引數
      • 可變引數
      • 條件陳述句
      • 回圈陳述句
  • 面向物件
      • 概述
      • 類的定義和使用
      • 抽象類
      • 伴生類和伴生物件
      • case和trait
  • 集合
      • 陣列
      • List
      • Set
      • Map
      • Optuon&Some&None
      • Tuple
  • 模式匹配
      • 基本型別
      • List
      • 型別匹配
      • 例外處理
  • 高級函式
      • 字串
      • 匿名函式
      • Currying
      • 高階函式

入門

概述

https://www.scala-lang.org/

Scala combines object-oriented and functional programming in one concise, high-level language. Scala’s static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.

  • 學習Scala的意義:
    Spark、Kafka、Flink
    優雅
    開發速度快
    融合到生態圈

安裝

  1. 安裝 Java 8

  2. 下載 download scala 網址:https://www.scala-lang.org/download/2.11.8.html

  3. 解壓 unzip scala

  4. 配置環境變數(可選)
    Windows 需配置兩個 Path中: D:\scala\bin 和 D:\scala\jre\bin

  5. 查看是否生效

Linux或Mac中操作步驟:
1.tar -zxvf scala-2.11.8.tgz -C  解壓路徑
2.到解壓目錄下 pwd  復制整個路徑 
3.將上面的路徑 添加到環境變數中
	vi ~/.bash_profile
		export SCALA_HOME=復制的路徑
		export PATH=$SCALA_HOME/bin:$Path
	保存
	source ~/.bash_profile
	echo $SCALA_HOME

下載之后的scala目錄下的bin目錄中 有普通檔案 和 .bat檔案
.bat檔案是在Windows中用的,Linux或Mac中用不到,所以可以刪掉 rm *.bat

Java VS Scala

Java

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World..");
	}
}

Scala(每行代碼并不強求使用;結束,但是Java是必須的)

Object HelloWorld {
	def main(args : Array[String]) {
		println("Hello World..")
	}
}

val 和 var

  • val:值
final
val 值名稱:型別=xx
val a = 1  (不可變)
val a : int = 1
  • var:變數
var 值名稱:型別=xxx
var b = 1
var b : int = 1

基本資料型別

  • Byte/Char
  • Short/Int/Long/Float/Double
  • Boolean
    只有Float宣告時比較特別
  • var c : Float = 1.1f
scala> b=20
b: Int = 20

scala> val b:Int =10
b: Int = 10

scala> val c:Boolean=true
c: Boolean = true

scala> val d =1.1
d: Double = 1.1

scala> val e:Float=1.2f
e: Float = 1.2

lazy在Scala中的應用

lazy var d : int = 1;
延遲加載,只有在第一次使用時才加載

讀取檔案并以字串形式輸出

	import scala.io.Source._
	var info = fromFile("...").mkString

如果用lazy var info = fromFile("…").mkString,開始是檢測不到錯誤的,要小心使用

*注意:當一個變數宣告為lazy,只有當你第一次操作時才會去真正訪問,如果不去訪問,即使寫錯了,也不會發現

開發工具IDEA

Maven


1.下載IDEA和Maven
2.進入IDEA,新建專案 選擇Maven 勾選create from archetype 選擇scala-archetype simple-> 正常創建(注意Maven倉庫位置)
3.IDEA默認是不支持Scala的,需要下載Scala插件
	File -> settings -> Plugins -> install JetBrains plugin -> scala
	之后就可以new 一個Scala類了
4.新建測驗類,運行報錯
	洗掉pom.xml中<arg>make:transitive</args>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>untitled5</artifactId>
  <version>1.0-SNAPSHOT</version>
  <inceptionYear>2008</inceptionYear>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <encoding>UTF-8</encoding>
    <scala.version>2.11.8</scala.version>
    <spark.version>2.3.0</spark.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>

    <!--引入Spark Core的依賴-->
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.11</artifactId>
      <version>2.3.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.12</artifactId>
      <version>2.4.3</version>
    </dependency>

  </dependencies>

  <build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <testSourceDirectory>src/test/scala</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.15.0</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <args>
                <arg>-dependencyfile</arg>
                <arg>${project.build.directory}/.scala_dependencies</arg>
              </args>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <useFile>false</useFile>
          <disableXmlReport>true</disableXmlReport>
          <!-- If you have classpath issue like NoDefClassError,... -->
          <!-- useManifestOnlyJar>false</useManifestOnlyJar -->
          <includes>
            <include>**/*Test.*</include>
            <include>**/*Suite.*</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


函式

方法定義

	def 方法名(引數: 引數型別): 回傳值型別 = {
		//方法體

		//最后一行作為回傳值(不需要使用return)
	}

	def max(x: Int, y: Int): Int = {
		if(x > y)
			x
		else 
			y
	}


package org.example

object App {

  def main(args: Array[String]): Unit = {
    println(add(2,5))
  }


  def add(x:Int,y:Int):Int={
  x+y
  }
}

7

package org.example

object App {

  def main(args: Array[String]): Unit = {

    println(three())
    //沒有入參的時候可以不用寫
    println(three)
  }




  def three()=1+2
}

無回傳值 自動加Unit

默認引數

默認引數: 在函式定義時,允許指定引數的默認值

  //引數
  def sayName(name: String ) = {
    println(name)
  }

  //默認引數
  def sayName1(name: String ="Jack") = {
    println(name)
  }


//main呼叫

    sayName("jaja")
    sayName1()
    sayName1("Ma")

jaja
Jack
Ma

相關原始碼:SparkContext中使用

命名引數

可以修改引數的傳入順序


  	def speed(destination: Float, time: Float): Float {
  		destination / time
  	}

  	println(speed(100, 10))
  	println(speed(time = 10, destination = 100))

可變引數

變引數(可傳入任意多個相同型別的引數) java中 int… numbers
JDK5+:可變引數

	def sum(number: Int*) =  {
		var result = 0
		for(num <- number) {
			result += num
		}
		result
	}

相關原始碼:org.apache.spark.sql.Dataset中的select方法

條件陳述句

回圈陳述句

  • to 1 to 10 (左閉右閉) 1.to(10)
  • range Range(1,10) (左閉右開的) Range(1,10,2) (2為步長)
  • until 1 until 10 (左閉右開)

to、until的底層呼叫都是Range

scala> 1 to 10
res1: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> Range(1,10)
res2: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> 1.to(10)
res3: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> Range(1,10,2)
res4: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

scala> Range(1,10,5)
res5: scala.collection.immutable.Range = Range(1, 6)

scala> Range(10,1,-1)
res8: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2)

scala> 1 until 10
res9: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

  • for
	for(i <- 1.to(10)) {
		println(i)
	}
	for(i <- 1.until(10, 2)) {
		println(i)
	}
	for(i <- 1 to 10 if i % 2 == 0) {
		println(i)
	}

	val courses = Array("Hadoop", "Spark SQL", "Spark Streaming", "Storm", "Scala")
	for(x<- courses) {
		println(x)
	}

	//x其實就是courses里面的每個元素
	// => 	 就是將左邊的x作用上一個函式,變成另外一個結果


	courses.foreach(x=> println(x))

  • while
	var (num, sum) = (100, 0)
	while(num > 0){
		sum = sum + num
		num = num - 1
	}
	println(sum)

面向物件

概述

  • Java/Scala OO(Object Oriented)
    • 封裝:屬性、方法封裝到類中,可設定訪問級別
    • 繼承:父類和子類之間的關系 重寫
    • 多型:父類參考指向子類物件 開發框架基石
Person person = new Person();
User user = new User();
Person person =new User();

類的定義和使用


package org.example

object ObjectApp {
  def main(args: Array[String]): Unit = {
    val person = new People()
    person.name = "Messi"
    //    println(person.name + ".." + person.age)
    println("invoke eat method: " + person.eat)
    person.watchFootball("Barcelona")

    person.printInfo()
    //編譯不通過 private 修飾
    //    println(person.gender)
  }

}



class People{
  //var(變數)型別自動生成getter/setter
  //這種寫法就是一個占位符
  var name: String = _
  //val(常量)型別自動生成getter
  val age: Int = 10

  private [this] var gender = "male"

  def printInfo() : Unit = {
    print("gender: " + gender)
  }

  def eat(): String = {
    name + " eat..."
  }

  def watchFootball(teamName: String): Unit = {
    println(name + " is watching match of " + teamName)
  }
}



invoke eat method: Messi eat…
Messi is watching match of Barcelona
gender: male

###繼承和重寫

  • 繼承
    class Student(name: String, age: Int, var major: String) extends Person(name, age) {}

  • 重寫

	override def acquireUnrollMemory()
	override def toString = "test override"
package org.example

object ConstructorApp {
  def main(args: Array[String]): Unit = {
    var person =new Person("zhangsan",99)
    println(person.age+":"+person.name)
    var person2 =new Person("zhangsan",99,"Man")
    println(person2.age+":"+person2.name+";"+person2.gender)
  }

}
//主構造器
class Person(val name: String, val age: Int){
  println("Person constructor enter...")

  val school = "ustc"
   //占位符肯定要預先指定型別
  var gender: String = _

  //附屬構造器
  def this(name: String , age: Int, gender: String){
    //必須要呼叫主構造器或者其他附屬構造器
    this(name, age)
    this.gender = gender
  }

  override def toString = "test override"
  println("Person Constructor leave...")

}

//繼承
//name: String, age: Int, var major: String 繼承父類的可以不用直接寫var 否則需要重新申明
class Student(name: String, age: Int, var major: String) extends Person(name, age) {

  //重寫
  override val school = "pku"
  println("Person Student enter...")

  println("Person Student leave...")
}


抽象類

package org.example

object AbstractApp {
  def main(args: Array[String]): Unit = {
    var stu =new Student1();
    println(stu.age)
    println(stu.name)
    stu.speak;
  }
}
abstract class Person3{
  def speak

  val name: String
  val age: Int
}

class Student1 extends Person3{
  override def speak: Unit = {
    println("speak")
  }
  override val name: String = "Messi"
  override val age: Int = 32
}

伴生類和伴生物件

如果有一個class,還有一個與class同名的object 互為 伴生類和伴生物件

	class ApplyTest{
		def apply(){
			println(...)
		}
	} 
	object ApplyTest{
		def apply(){
			println("Object ApplyTest apply...")
			new ApplyTest
		}
	} 

類名() ==> Object.apply
物件() ==> Class.apply
最佳實踐:在Object的apply方法中去new一個Class

package org.example


object ApplyApp {
  def main(args: Array[String]): Unit = {
//    for(i<-1 to 10){
//      ApplyTest.incr
//    }
//    //object 是一個單例物件
//    println(ApplyTest.count)

    var b=ApplyTest()
    //默認走的是object=》apply
    //Object ApplyTest apply...

    println("-----------------------")
    var c= new ApplyTest()
    c()
    //Class ApplyTest apply...
  }

}
class ApplyTest {
  def apply() = {
    println("Class ApplyTest apply...")

  }

}
object ApplyTest {
  println("Object start...")
  var count = 0
  def incr={
    count=count+1
  }
  def apply() = {
    println("Object ApplyTest apply...")

    //在object中的apply中new class
    new ApplyTest
  }
  println("Object end...")
}

case和trait

case class :不用new

case class Dog(name: String)
直接可以呼叫Dog("wangcai")

Trait: 類似implements

xxx entends ATrait 
xxx extends Cloneable with Logging with Serializable

原始碼中Partition類

集合

陣列


package org.example

object ArrayApp extends App{
  //println("hello")
  val a = new Array[String](5)
  a(0)="hello"
  println(a(0))

  val b = Array("hello","world")

  val c = Array(1,2,3,4,5,67)
  c.sum
  c.max
  c.mkString("/")

}



  val d=scala.collection.mutable.ArrayBuffer[Int]()

  d+=1
  d+=2
  d+=(2,33,4)
  d++=Array(33,45,22)
  println(d+"-------------------")
  d.insert(0,999)
  d.remove(1,2)
  d.trimEnd(2)
  println(d+"-------------------")
  //轉化成不可變的
  d.toString()
  for(i<-0 until d.length){

    println(c(i))
  }

hello
ArrayBuffer(1, 2, 2, 33, 4, 33, 45, 22)-------------------
ArrayBuffer(999, 2, 33, 4, 33)-------------------
1
2
3
4
5

List

list是不可變的,對list進行添加洗掉或者取值等操作均會回傳一個新的list,

scala> Nil
res4: scala.collection.immutable.Nil.type = List()

scala> Nil
res4: scala.collection.immutable.Nil.type = List()

scala> val l= List(1,2,3,4,5,56)
l: List[Int] = List(1, 2, 3, 4, 5, 56)

scala> l.head
head   headOption

scala> l.head
res5: Int = 1

scala> l.tail
tail   tails

scala> l.tail
res6: List[Int] = List(2, 3, 4, 5, 56)

scala> l.tails
res7: Iterator[List[Int]] = non-empty iterator

scala>



 val d=scala.collection.mutable.ArrayBuffer[Int]()

  d+=1
  d+=2
  d+=(2,33,4)
  d++=Array(33,45,22)
  d++ =List(1,2,3,4,)

Set

set是一個非重復的集合,若有重復資料,則會自動去重,

scala> val set = Set(1,2,3,1,2,5)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)



Map

map是K-V鍵值對集合,

package org.example

object MapApp {

  def main(args: Array[String]): Unit = {

    val map = Map(
      "1" -> "hello" ,
      2 -> "world",
      3 -> "!!!!!"
    )
    println(map.mkString(","))

    println("-----------------------")
    for(x<-map){
      println(x._1+":"+x._2)
    }

    println("-----------------------")

    var keys = map.keys
    var keyIterator = keys.iterator
    while(keyIterator.hasNext) {
      val key = keyIterator.next()
      println(key + "\t" + map.get(key).get)
    }



  }

}


 1 -> hello,2 -> world,3 -> !!!!!
-----------------------
1:hello
2:world
3:!!!!!
-----------------------
1	hello
2	world
3	!!!!!


Optuon&Some&None

    val map = Map(
      "1" -> "hello" ,
      2 -> "world",
      3 -> "!!!!!"
    )

    println(map.get(2))
    println(map.get(999))

Some(world)
None

option.scala


@SerialVersionUID(5066590221178148012L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
case object None extends Option[Nothing] {
  def isEmpty = true
  def get = throw new NoSuchElementException("None.get")
}


@SerialVersionUID(1234815782226070388L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class Some[+A](x: A) extends Option[A] {
  def isEmpty = false
  def get = x
}

Tuple

與串列一樣,與串列不同的是元組可以包含不同型別的元素,元組的值是通過將單個的值包含在圓括號中構成的,創建程序可加new關鍵詞,也可不加,



package org.example

object TupleApp {

  def main(args: Array[String]): Unit = {

    var t=new Tuple3[Int,Int,String](1,99,"hello")
    println(t.toString())

    println("----------------")

    var t2=(9999,"hello")

    println(t2.toString())

    println(t2.swap.toString())


  }

}





(1,99,hello)
----------------
(9999,hello)
(hello,9999)


模式匹配

基本型別

Java : 對一個值進行條件判斷例如switch

模式匹配類似于java的switch case,Scala的模式匹配不僅可以匹配值還可以匹配型別、從上到下順序匹配,如果匹配到則不再往下匹配、都匹配不上時,會匹配到case _ ,相當于default、match 的最外面的”{ }”可以去掉看成一個陳述句,


def match_test(m:Any) = {
       m match {
         case 1 => println("nihao")
         case m:Int => println("Int")
         case _ => println("default")
       }
    }

package org.example

object MarchApp {

  def main(args: Array[String]): Unit = {

    def judeGrade(grade:String)={
      grade match{
        case "B" => println("Just so so")
        case "A" => println("good")
        case "S" => println("cool")
        case _=> println("No.1")
      }
      
    }
    judeGrade("S")
    judeGrade("A")
    judeGrade("SSS")
  }

}



```scala
> cool
good
No.1



### Array


```scala


    def greeting(array:Array[String]) = {
      array match {
        case Array("zs")=> println("hi,zs")
        case Array(x,y)=> println(x+"and"+y)
        case Array("zs",_*)=>println("zs and other")
        case _=>println("everyone")
      }
    }

    greeting(Array("zs"))
    greeting(Array("zs","ls"))


hi,zs
zsandls

List

    def greeting1(list:List[String]) = {
      list match {
        case "zs"::Nil=> println("hi,zs")
        case x::y::Nil=> println(x+"and"+y)
        case "zs"::tail =>println("zs and other")
        case _=>println("everyone")
      }
    }

    greeting1(List("zs"))
    greeting1(List("zs","ls"))
  }

型別匹配


    def matchType(obj: Any) = {
      obj match {
        case x: Int => println("hi,int")
        case y: String => println(y)
        case m: Map[_, _] => println("map")
        case _ => println("everyone")
      }
    }

    matchType(Map(1 -> "yes"))
    matchType(11)
    matchType("hello")
  }

例外處理


 try{
      val i=10/0
      println(i)

    }catch {
      case e:ArithmeticException=>println(e.getMessage)
      case e:Exception=>println(e.getMessage)
    }finally {

    }


/ by zero

高級函式

字串

  • 插值
  val s ="hello"
  val name="jacksun"
  println(s+name)
  println(s+":"+name)

  println(s"hello:$name")

  • 多行字串
  //多行
  var d =
    """
      |1
      |2
      |3
      |4
      |5
      |5
      |6
    """.stripMargin

匿名函式

匿名函式分為有參匿名函式、無參匿名函式、有回傳值的匿名函式,(可以將匿名引數的回傳給一個val宣告的值,匿名函式不能顯式的宣告回傳值)

package org.example

object FunctionApp extends App {

  //有引數匿名函式
  val printy = (a : Int) => {
    println(a)
  }
  printy(999)

  //無引數匿名函式
  val printx = ()=>{
    println("Scala No.1")
  }
  printx()

  //有回傳值的匿名函式
  val add = (a:Int,b:Int) =>{
    a+b
  }
  println(add(4,4))

}


Currying

將接受一個引數的轉化成2個

def add(a:Int,b:Int) = a+b
println(add(2,1))
//Currying
def add2(a:Int)(b:Int) = a+b
println(add2(2)(1))

高階函式

高階函式(Higher-Order Function)就是操作其他函式的函式,

Scala 中允許使用高階函式, 高階函式可以使用其他函式作為引數,或者使用函式作為輸出結果,

object Test {
   def main(args: Array[String]) {

      println( apply( layout, 10) )

   }
   // 函式 f 和 值 v 作為引數,而函式 f 又呼叫了引數 v
   def apply(f: Int => String, v: Int) = f(v)

   def layout[A](x: A) = "[" + x.toString() + "]"
   
}


  • map

對每個集合的元組進行操作


scala> val l =List(1,2,3,4,5,6,7,8,9)
l: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> l.map(x=>(x+1))
res5: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> l.map((x:Int)=>x*2)
res6: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18)

scala> l.map(x=>x*2)
res7: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18)

scala> l.map(_*2)


  • filter
    過濾條件
scala> l.filter(_>5)
res9: List[Int] = List(6, 7, 8, 9)

  • take
    取數
scala> l.take(1)
res10: List[Int] = List(1)

scala> l.take(3)
res11: List[Int] = List(1, 2, 3)

  • reduce
    兩兩相加相減
scala> l.take(3).reduce(_-_)
res15: Int = -4
// 從左相減
scala> l.take(3).reduceLeft(_-_)
res16: Int = -4
// 從右相減
scala> l.take(3).reduceRight(_-_)
res17: Int = 2

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303627.html

標籤:其他

上一篇:LeetCode 416. 分割等和子集

下一篇:每天都在紅綠燈前面梭行,不如自己來實作個紅綠燈?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more