当前位置: 首页 > news >正文

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建

46.函数作为值三

package cn . itbaizhan . chapter03
// 函数作为值,函数也是个对象
object FunctionToTypeValue {
def main ( args : Array [ String ]): Unit = {
//Student stu = new Student()
/*val a = ()=>{"GTJin"}
// 输出对象的地址
//cn.itbaizhan.chapter03.FunctionToTypeValue$$
$Lambda$1/495053715@3f0ee7cb
println(a)*/
// 完整写法
def funcA (): String = {
println ( "funcA 被执行了。。。 " )
"GTJin"
  }
73    
/*println("--------before val x = funcA()--
--------")
// 执行下一行代码,输出: funcA 被执行了。。。 表示将
函数 funcA 的结果赋值给了 x ,并不是将 funcA 作为对象赋值给 x
val x = funcA()
println(x)
println("--------after val x = funcA()-----
-----")*/
// 如果想将 funcA 函数作为对象赋值给 x ,那么该如何实
现?
// 使用 " 函数名 + 空格 + _", 将函数作为对象赋值给
x ,在赋值的过程中不会函数体中的代码
val x = funcA _
// 写下 x 后提示框显示 "x ()=>String", 表示 x 是一
个无参返回值类型为 String 的函数
// 万物皆对象,是对象就应该有对应的类型,所以函数也
有对象的类型
//Function0[String] Function0 表示 0 个参数的函
数对象 [String] 表示函数的返回值类型为 String
//Function1[-T1,+R] 表示 1 个参数的函数对象 []
面最后的 +R 表示返回值类型为, -T1 参数类型
//Function2[-T1,-T2,+R] 表示 2 个参数的函数对象
[] 里面最后的 +R 表示返回值类型, -T1 第一参数类型 -T2 第二
个参数类型
//... Function22 将函数作为对象赋值时,参数声明
的个数最多 22 个,对应 Function22
// 函数独立定义和使用时,声明参数的个数时没有限制
的。、
//22 Scala 语言中是一个神奇的数字,官方没有明确说
明,后续还会在其它地方见到 Tuple22
val f1 : Function0 [ String ] = funcA _
println ( x == f1 ) //false 相当于创建了两个函数对象
74    
def funcB ( name : String ): String = {
"funcB....name=" + name
  }
// 函数类型还有另外一种表示方式: ( 参数类型 )=> 返回值
类型 ,多个参数之间使用逗号隔开
//val f2:Function1[String,String] = funcB
_
val f2 :( String ) => String   = funcB _
// 如果函数只有一个参数小括号可以省略
val f2_1 : String => String   = funcB _
def funcC ( name : String , age : Int ): String = {
s "name=${name},age=${age}"
  }
// 两个或两个以上参数时,小括号不能省略
val f3 :( String , Int ) => String = funcC _
//val f3_1:String,Int=>String = funcC _ //
错误的
/**val x = funcA _ 为什么在函数名后 使用下滑线让
函数作为对象使用,因为代码中没有明确的变量
* 类型,所以需要通过取值类型进行推断。
* 如果变量声明时的类型为函数类型,那么可以不适用下
划线让函数作为对象
*
*/
val f4 :( String ) => String   = funcB
val f5 :( String , Int ) => String = funcC
}
}

47.函数作为值四

实时效果反馈
1. 关于 Scala 函数作为值的描述,错误的是:
A
函数类型表示方式: ( 参数类型 ) => 返回类型 注:多个参数
的话之间逗号隔开。
B
如果在声明时并没有指定具体的函数类型,那么下划线不能
省略。
C
如果变量声明的类型为函数类型,那么可以不使用下划线让
函数作为对象。
D
将函数作为对象赋值时,参数声明的个数没有限制。
答案:
1=>D 将函数作为对象赋值时,参数声明的个数最多 22 个,对
Function22

48.函数作为参数_无参无返回值

object FunctionToTypeArgXx {
def main ( args : Array [ String ]): Unit = {
def funcA ( x : Int , y : Int , 函数 ): Unit = {
val result = 函数 ( x , y )
println ( result )
  }
funcA ( 1 , 2 , 求和函数 )
funcA ( 1 , 2 , 求差函数 )
}
}
76 代码拆解分析演示:
package com . itbaizhan . chapter03
// 函数作为参数
object FunctionToTypeArg1 {
def main ( args : Array [ String ]): Unit = {
//TODO 1 无参无返回值
/**public void method(Student stu){}
* public void method( 参数类型 参数名称 ){}
* Scala 同理,让函数作为参数
* fun:()=>Unit 表示参数是一个函数对象,这个函数
是一个无参无返回值的函数
*     () 表示是一个无参的函数
*     Unit 表示是一个无返回值的函数
*/
def funcA ( fun :() => Unit ): Unit = {
// 调用传递过来的函数
fun ()
  }
def funcObjA (): Unit = {
println ( "funcObjA 被调用 " )
  }
//funcA(funcObjA _)
// 下划线可以省略 应该在函数 funcA 声明的时候定义了
参数的函数类型   无参无返回值的类型
//funcA(funcObjA)
// TODO 2 有参数以后返回值
/**fun:(Int,Int)=>Int) 表示 funcB 的参数为一个函
* (Int,Int) 这个函数是一个有两个参数的函数,这两
个参数都是 Int 类型
* Int 表示这个函数的返回值是一个 Int 类型
77    
* @param fun
*/
def funcB ( fun :( Int , Int ) => Int ): Unit = {
// 该设计缺陷是 fun(2,1) 写死的参数值
val result = fun ( 2 , 1 )
println ( result )
  }
// 定义一个函数
def funcObjB1 ( x : Int , y : Int ): Int = {
x + y
  }
//funcB(funcObjA) // 错误的,因为 funcObjA 参数和
返回值类型 funcB 要求的参数类型不匹配
funcB ( funcObjB1 ) //3
def funcObjB2 ( x : Int , y : Int ): Int = {
x - y
  }
funcB ( funcObjB2 ) //1
def funcObjB3 ( x : Int , y : Int ): Int = {
x / y
  }
funcB ( funcObjB3 ) //2
//TODO 3. 省略 作为参数的函数
// 省略关键字、函数名、返回值类型 ; 在将 ": =" 改为
"=>"
funcB (( x : Int , y : Int ) => {
x / y
  })
// 继续简化: 函数体只有一行,函数体外的 {} 可以省略
funcB (( x : Int , y : Int ) => x / y )
// 参数的类型如果能够推断出来,参数的类型可以省略
78 参数函数简化案例一,一个参数无返回值:
funcB (( x , y ) => x / y )
// 如果参数只有一个的话,参数列表的小括号可以省略
//funcB(x,y=> x/y) 错误的 参数 >=2 话,参数列表的
小括号不可以省略
// 如果参数在使用时,按照声明的顺序只使用一次时,那
么可以使用下划线代替
println ( "------------funcObjBn 不需要定义 -----
------------" )
funcB (( _ / _ )) //2 继续省略
funcB ( _ / _ ) //2
funcB ( _ - _ ) //1
funcB ( _ * _ ) //2
funcB ( _ + _ ) //3
}
}

49.函数作为参数_有参有返回值

一个参数无返回值:
funcB (( x , y ) => x / y )
// 如果参数只有一个的话,参数列表的小括号可以省略
//funcB(x,y=> x/y) 错误的 参数 >=2 话,参数列表的
小括号不可以省略
// 如果参数在使用时,按照声明的顺序只使用一次时,那
么可以使用下划线代替
println ( "------------funcObjBn 不需要定义 -----
------------" )
funcB (( _ / _ )) //2 继续省略
funcB ( _ / _ ) //2
funcB ( _ - _ ) //1
funcB ( _ * _ ) //2
funcB ( _ + _ ) //3
}
}
package com . itbaizhan . chapter03
object FunctionToTypeArg2 {
def main ( args : Array [ String ]): Unit = {
def funcA ( fun :( String ) => Unit ): Unit = {
fun ( "GTJin" )
  }
def funArg ( name : String ): Unit = {
println ( name )
  }
funcA ( funArg )
// 如果函数 funArg 只是被调用一次,可以进行简化
// 首先省略 def 、函数名、返回值类型
funcA (
    ( name : String ) => {
println ( name )
79 参数函数简化案例二,两个参数有返回值:
  })
// 函数体只有一行省略大括号
funcA (
    ( name : String ) => println ( name )
  )
// 参数类型可以推导出来,也可以省略
funcA (
    ( name ) => println ( name )
  )
// 只有一个参数,小括号也可以省略
funcA (
name => println ( name )
  )
// 还可以继续省略,以后在 spark 的代码中会遇到类似的
用法
funcA ( println ( _ )) // 匿名函数的至简原则的最简化版
funcA ( println ) // 该方式调用的不再是匿名函数的简化
版了,而是调用 println 函数
//funcA(funArg)
}
}

50.函数作为参数_有参有返回值简化演示

package com . itbaizhan . chapter03
object FunctionToTypeArg3 {
def main ( args : Array [ String ]): Unit = {
def funcA ( fun :( Double , Double ) => Double ):
Double = {
fun ( 1.0 , 2.0 )
  }
80 参数函数简化案例三:
def funcB ( x : Double , y : Double ): Double = {
x / y
  }
funcA ( funcB )
// 简化函数
funcA (
    ( x : Double , y : Double ) => {
x / y
    }
  )
funcA (
    ( x , y ) => {
x / y
    }
  )
funcA (
    ( x , y ) => x / y
  )
// 顺序使用且只用一次可以简化为下划线
println ( funcA ( _ / _ )) //0.5
// 但是如果不是顺序使用,无法使用下划线简化,比如:
结果为 2 不是 0.5
println (
funcA (
      ( x , y ) => y / x
    )
  )
}
}

51.函数作为参数_一参无返回值简化演示

package com . itbaizhan . chapter03
81 3.6.3 函数作为返回值
// 函数作为参数的常见场景
object FunctionToTypeArg4 {
def main ( args : Array [ String ]): Unit = {
def funcA ( x : Int , y : Int , fun :( Int , Int ) => Int ):
Unit = {
val result = fun ( x , y )
println ( result )
  }
funcA ( 1 , 2 ,
    ( x : Int , y : Int ) => x + y
  )
funcA ( 1 , 2 ,
    ( x , y ) => x + y
  )
funcA ( 1 , 2 , _ + _ )
funcA ( 1 , 2 , _ - _ )
funcA ( 1 , 2 , _ * _ )
funcA ( 1 , 2 , _ / _ )
}
}

52.函数作为参数_两参有返回值简化演示

3.6.3 函数作为返回值
// 函数作为参数的常见场景
object FunctionToTypeArg4 {
def main ( args : Array [ String ]): Unit = {
def funcA ( x : Int , y : Int , fun :( Int , Int ) => Int ):
Unit = {
val result = fun ( x , y )
println ( result )
  }
funcA ( 1 , 2 ,
    ( x : Int , y : Int ) => x + y
  )
funcA ( 1 , 2 ,
    ( x , y ) => x + y
  )
funcA ( 1 , 2 , _ + _ )
funcA ( 1 , 2 , _ - _ )
funcA ( 1 , 2 , _ * _ )
funcA ( 1 , 2 , _ / _ )
}
}
package com . itbaizhan . chapter03
// 函数作为函数的返回值
object FunctionToFunResult {
def main ( args : Array [ String ]): Unit = {
//TODO 1. 对比 Java 代码
/**public Student getStudent(){
*     return new Student();
* }
* 返回的是一个对象,而在 Scala 中函数也是一个对象,
82 为何不直接调用 resultFun()?
* 所以也可以使用一个函数作为另外一个函数的返回值
*/
def resultFun (): Unit = {
println ( "resultFun...." )
  }
def funcA (): () => Unit = { // 写上函数的类型
()=>Unit
resultFun _ // 返回的是函数对象
  }
val f1 = funcA _
//f2 就是 resultFun
val f2 = f1 ()
// 调用 f2
f2 ()
// 简化以上调用 以后的代码中经常遇到
funcA ()()
// 上行代码等价于 resultFun(), 那么为何不直接调用
呢?
}
}

53.函数作为参数_案例三

54.函数作为返回值一

55.函数作为返回值二

package com . itbaizhan . chapter03
object FunctionToFunResult2 {
def main ( args : Array [ String ]): Unit = {
//TODO 2. 将函数作为返回值返回,一般应用在将内部的
函数在外部使用
/*def outer(): ()=>Unit ={
def inner():Unit={
println("inner.....")
}
inner _
}
outer()()*/
//TODO 3. 如果层次多了,就比较麻烦了,这种方式不推
荐自定义开发中使用
def outer (): () => () => Unit = {
def mid (): () => Unit = {
def inner (): Unit = {
println ( "inner....." )
      }
inner _
    }
mid _
  }
outer ()()()
}
}

56.闭包

package com . itbaizhan . chapter03
// 闭包
object FunctionClosure {
def main ( args : Array [ String ]): Unit = {
def outer ( x : Int ): ( Int ) => Int = {
def inner ( y : Int ): Int = {
x + y
    }
inner _
  }
//println(outer(2)(3))
val fun = outer ( 2 )
84 由于在执行 inner 的时候, outer 已经出栈了,所以变量 x 已经不
存在,那么在 inner 中该如何进行计算呢,底层又是如何实现的呢?
反编译:选择
target/classes/com/itbaizhan/chapter03/FunctionClosure->
->Decompile Scala to Java
val fun2 = fun ( 3 )
println ( fun2 )
}
}

57.匿名函数

package com . itbaizhan . chapter03
// 匿名函数
object FunctionNoName {
def main ( args : Array [ String ]): Unit = {
def funcA ( fun : Int => Int ): Int = {
fun ( 3 )
  }
// 使用匿名函数作为参数
println ( funcA (( x : Int ) => { x * 5 }))
// 类型可以推导出来所以可以省略
println ( funcA (( x ) => { x * 5 }))
// 只有一个参数小括号可以省略
println ( funcA ( x => { x * 5 }))
// 函数体只有一行, {} 可以省略
println ( funcA ( x => x * 5 ))
// 使用 _ 进行简化
println ( funcA ( _ * 5 ))
// funcA 内部使用 fun(3) 不够灵活,再次进行完善
def funcB ( x : Int , fun : Int => Int ): Int = {
fun ( x )
  }
println ( funcB ( 4 , _ * 2 )) //8
println ( funcB ( 4 , _ + 2 )) //6
}
}

58.控制抽象

package com . itbaizhan . chapter03
import scala . util . control . Breaks
// 函数控制抽象
object FunctionControlAbstract {
def main ( args : Array [ String ]): Unit = {
//TODO 1. 对比匿名函数方式
// 函数类型: ()=>Unit
def funcA ( opt : () => Unit ): Unit = {
opt ()
  }
funcA {
    () => {
println ( " 函数控制抽象入门 " )
    }
  }
//TODO 2. 函数控制抽象
// 参数类型不完整,在传递参数时也是不完整的;只传递
代码就可以了,不需要完整的声明。
def funcB ( opt : => Unit ): Unit = {
opt
  }
funcB {
println ( " 函数控制抽象入门 " )
  }
//TODO 3. 可以通过控制抽象设计语法
Breaks . breakable {
for ( index <- 1 to 5 ){
if ( index == 3 ){
Breaks . break ()
89 3.10 柯里化函数
柯里化是一个数学家 Curry 的音译。
将无关的参数分离开,提高函数效率。
      }
println ( "index=" + index )
    }
  }
}
}

59.柯里化函数

柯里化是一个数学家 Curry 的音译。
将无关的参数分离开,提高函数效率。
      }
println ( "index=" + index )
    }
  }
}
}
package com . itbaizhan . chapter03
// 柯里化函数
object FunctionCurry {
def main ( args : Array [ String ]): Unit = {
def funcA (): Int = {
var result : Int = 1
for ( i <- 1 to 10 ){
result = i
Thread . sleep ( 10 )
    }
result
  }
def funcB (): Int = {
var result : Int = 1
for ( i <- 1 to 20 ){
result = i
Thread . sleep ( 10 )
    }
result
90 运行输出:
用时几乎缩减百分之五十。
  }
def funcC ( a : Int , b : Int ): Int = {
a + b
  }
def funcD ( a : Int )( b : Int ): Int = {
a + b
  }
val start1 : Long =
System . currentTimeMillis ()
println ( funcC ( funcA (), funcB ()))
val end1 : Long = System . currentTimeMillis ()
println ( "------------ 未使用柯里化用时 :" + ( end1 -
start1 ))
val start2 : Long =
System . currentTimeMillis ()
println ( funcD ( funcA ())( funcB ()))
val end2 : Long = System . currentTimeMillis ()
println ( "------------ 使用柯里化用时 :" + ( end2 -
start2 ))
}
}
30
------------ 未使用柯里化用时 :695
30
------------ 使用柯里化用时 :328

60.递归函数

package com . itbaizhan . chapter03
// 递归函数
object FunctionRecursion {
def main ( args : Array [ String ]): Unit = {
//TODO 1. 递归函数
/** 递归函数:在函数内部调用函数本身
* 注意:
* 1.scala 中要求递归函数必须明确声明返回值类型
* 2. 递归函数一定要有跳出的出口
* 3. 传递的参数之间存在某种关系时才可以设计成递归函
* @param num
* @return
*/
def funcA ( num : Int ): Int = {
if ( num == 1 ) // 跳出的出口
num
else
num * funcA ( num - 1 )
  }
print ( funcA ( 5 ))
}
}

61.尾递归函数(选修)

tail recursion 义译为尾递归,或伪递归。
package com . itbaizhan . chapter03
import scala . annotation . tailrec
// ( ) 递归函数
object FunctionRecursion2 {
def main ( args : Array [ String ]): Unit = {
/*def funcA(): Unit = {//
funcA()
println("funcA....")
}
funcA()*/
def funcB (): Unit = {
println ( "funcB...." )
funcB ()
  }
funcB ()
93 Scala 中的尾递归被编译器优化为了 while 循环,所以应该理解
成为伪递归。
3.12 惰性函数 ( 选学 )
当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我
们首次对此取值,该函数才会执行。这种函数我们称之为惰性函
数。
}
}
public void main ( final String [] args ) {
this . funcB$1 ();
}
private final void funcB$1 () {
while ( true ) {
    . MODULE$ . println ( "funcB...." );
  }
}

62.惰性函数(选修)

当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我
们首次对此取值,该函数才会执行。这种函数我们称之为惰性函
数。
}
}
public void main ( final String [] args ) {
this . funcB$1 ();
}
private final void funcB$1 () {
while ( true ) {
    . MODULE$ . println ( "funcB...." );
  }
}
package com . itbaizhan . chapter03
// 惰性函数
object FunctionLazy {
def main ( args : Array [ String ]): Unit = {
// 函数结果没有使用,则函数不执行;直到使用结果才执
行。
def funcA (): String = {
println ( "funcA 被执行了 ......" )
" 天王盖地虎 "
  }
// 当函数返回值被声明为 lazy 时,函数的执行将被推迟,
直到我们首次对此取值 , 该函数才会被执行。
94 输出结果如下:
lazy val password = funcA ()
println ( "----------------" )
println ( password ) // 首次对此取值
println ( "================" )
}
}
----------------
funcA 被执行了 ......
天王盖地虎

章节4面向对象基础

63.面向对象基础概述

Scala 是一门完全面向对象的语言,摒弃了 Java 中很多不是面向
对象的语法。虽然如此,但其面向对象思想和 Java 的面向对象思想
还是一致的。
// 包声明
package com . itbaizhan . chapter04
// 类定义
class Point ( xc : Int , yc : Int ) {
// 属性
var x : Int = xc
var y : Int = yc
// 方法
def move ( dx : Int , dy : Int ) {
x = x + dx
y = y + dy
95 面向对象基础包含:包 package 、导入 import 、类、属性、访
问权限、方法、对象、构造方法等。

64.面向对象基础_包package

Scala 中基本的 package 包语法和 Java 完全一致,就是在代码的
最后不加 ";"
println ( "x 的坐标点 : " + x );
println ( "y 的坐标点 : " + y );
}
}
object ObjectAndClass {
def main ( args : Array [ String ]): Unit = {
// 实例化对象
val point = new Point ( 10 , 20 );
// 移到一个新的位置
point . move ( 10 , 10 );
}
}
package com . itbaizhan . chapter04
object PackageDemo {
}
96 Java package 包的语法比较单一, Scala 对此进行如下扩展:
1
Scala 中的包和类的物理路径没有关系
2
package 关键字可以嵌套声明使用
3
同一个源码文件中子包可以直接访问父包中的内容,而无需
import
//package com.itbaizhan.chapter04
package com
package itbaizhan
//package chapter04
package chapter05
object PackageDemo {
def main ( args : Array [ String ]): Unit = {
println ( "package.." )
}
}
//package com.itbaizhan.chapter04
package com
package itbaizhan {
class Person {
def showInfo (): Unit = {
println ( "showInfo..." )
  }
}
package chapter04 {
object PackageDemo {
def main ( args : Array [ String ]): Unit
= {
new Person (). showInfo ()
    }
97 4
Scala package 也可以看作对象,并声明属性和函数
PackageDemo main 方法中可以直接调用 showMe()
实时效果反馈
1. 关于 Scala 包的描述,错误的是:
A
Scala 中基本的 package 包语法和 Java 完全一致,就是在代码
的最后不加 ";"
B
package 关键字不可以嵌套声明使用。
C
Scala package 也可以看作对象,并声明属性和函数。
D
同一个源码文件中子包可以直接访问父包中的内容,而无需
import
答案:
1=>B package 关键字可以嵌套声明使用。

65.面向对象基础_类

66.面向对象基础_java中的导入

67.面向对象基础_Scala中的导入Import一

68.面向对象基础_Scala中的导入Import二

//TODO 6.scala 导入类的操作,是以相对路径 ( 当前所在
包的路径 ) 的方式导入的
// 如果想使用绝对路径的方式,需要在包名前添加:
_root_.
/* val hashMap = new java.util.HashMap[Int,
String]()
hashMap.put(1,"tuhao")
hashMap.put(2,"baifumei")
println(hashMap)//{1=tuhao, 2=baifumei}*/
//println(new
java.util.HashMap())//com.itbaizhan.chapter04.j
ava.util.HashMap@2ff4f00f
//println(new
_root_.java.util.HashMap())//{} 表示使用了 jdk
HashMap
//TODO 7.Scala 中可以给导入的类起别名,简化使用
import java . util .{ ArrayList => AList }
println ( new AList ())
}
}
/*package java{
package util{
class HashMap{
}
}
}*/
103 B
实时效果反馈
1. 关于 Scala Import 使用的描述,错误的是:
A
星号在 scala 中有特殊的用途,不能使用在 import 语句中,
需要使用 _ 来代替 *
import 导入语句只能用在 package 语句和 class 定义之间。
C
Scala 中可以给导入的类起别名,简化使用。
D
可以在一行中导入一个包中的多个类 , 简化代码。
答案:
1=>B import 导入语句可以在任意地方使用

69.面向对象基础_属性一

package com . itbaizhan . chapter04
import scala . beans . BeanProperty
class Animal {
// 属性声明, java 中可以不赋值, scala 中属性必须显示地
初始化
//var name:String // 抛错
// 可以直接赋予一个默认值
//var name:String = " 华南虎 "
// 如果希望像 java 一样可以由系统进行初始化,后续手动调
setter 赋值,声明时使用 _ 赋值
var name : String = _
// 使用 val 声明的属性,编译器将之编译为私有的属性,并使
final 修饰,不可修改,
// 所以只提供的 get 方法,而没有提供 set 方法
val age : Int = 30
// 属性声明时如果使用 private 修饰,编译器将该属性对应
get set 方法也是编译为私有化的方法
104 实时效果反馈
1. 关于 Scala 属性的描述,错误的是:
A
var 声明的属性编译器将之编译为类的私有属性,通过提供
getter seter 方法。
B
使用 val 声明的属性,编译器将之编译为私有的属性,并使
final 修饰,不可修改。
private var color : String = _
// 通过查看 Animal 类的源码,属性的 get set 方法不符合
bean 规范
// 如果想符合 bean 规范 (id=>getId,setId) ,需要在属性
声明前加上 @BeanProperty
@BeanProperty var kind : String = _
}
object ClassField {
def main ( args : Array [ String ]): Unit = {
val animal = new Animal ()
//var 声明的属性编译器将之编译为类的私有属性,通过提
getter seter 方法
// 如下方式赋值相当于调用的 animal.setName(" 东北
")
animal . name = " 东北虎 "
// 访问类的属性时相当于调用了对象的 get 方法
println ( animal . name )
//val 声明的属性被 final 修饰,并未提供 set 方法,所以
不可改变
//animal.age = 10
}
}
实时效果反馈
1. 关于 Scala 属性的描述,错误的是:
A
var 声明的属性编译器将之编译为类的私有属性,通过提供
getter seter 方法。
B
使用 val 声明的属性,编译器将之编译为私有的属性,并使
final 修饰,不可修改。
private var color : String = _
// 通过查看 Animal 类的源码,属性的 get set 方法不符合
bean 规范
// 如果想符合 bean 规范 (id=>getId,setId) ,需要在属性
声明前加上 @BeanProperty
@BeanProperty var kind : String = _
}
object ClassField {
def main ( args : Array [ String ]): Unit = {
val animal = new Animal ()
//var 声明的属性编译器将之编译为类的私有属性,通过提
getter seter 方法
// 如下方式赋值相当于调用的 animal.setName(" 东北
")
animal . name = " 东北虎 "
// 访问类的属性时相当于调用了对象的 get 方法
println ( animal . name )
//val 声明的属性被 final 修饰,并未提供 set 方法,所以
不可改变
//animal.age = 10
}
}
105 访问权限
有效范围
private
当前类中
默认缺省
当前类中、本包 ( 以及当前类所在的当前包中 )
protected
当前类中、本包、当前类的子类中
public
任意位置
访问权限
有效范围
private
当前类中
private 【包名】
当前类中、本包的类中(包私有)
protected
当前类中、子类中
默认缺省
表示公共的, scala 中没有 public 关键字
C
如果想属性的 set get 方法符合 bean 规范
(id=>getId,setId) ,需要在属性声明前加上 @BeanProperty
D
属性声明时是否使用 private 修饰,编译器对属性编译时都
是做一样的处理
答案:
1=>D 不一样处理,使用 private 修饰的属性的 get set 方法也
会被私有化;不使用 private 修饰的属性的 get set 方法是公共的。

70.面向对象基础_属性二

71.面向对象基础_访问权限

72.面向对象基础_方法

73.面向对象基础_对象

74.面向对象基础_构造方法

章节5面向对象高级

75.伴生类和伴生对象一

76.伴生类和伴生对象二

77.伴生类和伴生对象三

78.抽象类和抽象方法一

79.抽象类和抽象方法二

80.抽象属性一

81.抽象属性二

82.Trait_Java中的接口

83.Trait_基本使用一

84.Trait_基本使用二

85.Trait_作用解耦合

86.Trait_原理

87.Trait_初始化叠加一

88.Trait_初始化叠加二

89.Trait_功能叠加

90.Trait_反射一

91.Trait_反射二

92.多学三招_枚举类

93.多学三招_应用类

94.多学三招_type定义新类型

package com . itbaizhan . chapter05
object TypeDemo extends App {
//TODO 1.scala 源码
// java.lang.String 定义为 String
//type String       = java.lang.String
// java.lang.Class[T] 定义为 Class[T]
//type Class[T]     = java.lang.Class[T]
// 使用 type 关键字可以定义新的数据数据类型名称,本质上
就是类型的一个别名
type KIntVStrMap = java . util . HashMap [ Int ,
String ]
private val map = new KIntVStrMap ()
map . put ( 1 , "java" ) // 提示 key Int 类型, value
String 类型
map . put ( 2 , "scala" )
}

章节6异常

95.JAVA中的异常一

96.Java中的异常二

97.Scala中的异常

章节7集合类

98.集合类概述

99.队列Queue

100.元祖一

101.元祖二

102.Seq_不可变List一

103.Seq_不可变List二

104.Seq_不可变List三

105.Seq_不可变List四

106.Seq_可变ListBuffer一

107.Seq_可变ListBuffer二

108.Seq_可变ListBuffer三

109.Seq_可变List和不可变List转换

110.不可变Set

相关文章:

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值&#xff0c;函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…...

AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义

AI中的神经元与权重矩阵之间的关系 目录 AI中的神经元与权重矩阵之间的关系神经元连接角度看行和列的意义AI中的神经元概念 在人工智能领域,特别是神经网络中,神经元是基本的计算单元,它是对生物神经元的一种抽象模拟。就像生物神经元接收来自其他神经元的电信号,经过处理后…...

前端中常用的单位度量(px,rpx,rem,em,vw,vh)+图片自适应

文章目录 前端中常用的单位度量vw/vh 的场景应用px/rem/em 之间的转换关系项目中的rem 应用根元素 font-size 设置为16px 的应用惯例自适应之图片应用1. 使用 max-width 和 max-height2. 使用 object-fit 属性3. 使用 background-image 模拟图片展示 前端中常用的单位度量 px&…...

Attention计算中的各个矩阵的维度都是如何一步步变化的?

在Transformer模型中&#xff0c;各个矩阵的维度变化是一个关键的过程&#xff0c;涉及到输入、编码器、解码器和输出等多个阶段。以下是详细的维度变化过程&#xff1a; 输入阶段 输入序列&#xff1a;假设输入序列的长度为seq_len&#xff0c;每个单词或标记通过词嵌入&…...

Golang学习笔记_23——error补充

Golang学习笔记_20——error Golang学习笔记_21——Reader Golang学习笔记_22——Reader示例 文章目录 error补充1. 基本错误处理2. 自定义错误3. 错误类型判断3.1 类型断言3.2 类型选择 4. panic && recover 源码 error补充 1. 基本错误处理 在Go中&#xff0c;函数…...

DB-Engines Ranking 2025年1月数据库排行

DB-Engines Ranking 2025年1月数据库排行 DB-Engines排名根据数据库管理系统的受欢迎程度进行排名。排名每月更新一次。 2025年1月&#xff0c;共有423个数据库进入排行。 排行榜 Oracle Oracle 连续三月稳居榜首&#xff0c;排名稳定。2025 年 1 月分数较上月增 5.03&#x…...

积分与签到设计

积分 在交互系统中&#xff0c;可以通过看视频、发评论、点赞、签到等操作获取积分&#xff0c;获取的积分又可以参与排行榜、兑换优惠券等&#xff0c;提高用户使用系统的积极性&#xff0c;实现引流。这些功能在很多项目中都很常见&#xff0c;关于功能的实现我的思路如下。 …...

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…...

用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效

一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…...

什么是数据湖?大数据架构的未来趋势

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…...

Flutter pubspec.yaml 使用方式

Flutter pubspec.yaml 使用方式 pubspec.yaml 是 Flutter 项目中最重要的配置文件之一&#xff0c;用于管理应用的基本信息、依赖项、资源以及构建配置等内容。 1. 基本结构和字段 基本信息 name: my_flutter_app # 应用的名称 description: A new Flutter project …...

Elixir语言的学习路线

Elixir语言的学习路线 Elixir是一种动态、通用的编程语言&#xff0c;特别适合用于构建可扩展和维护性强的应用程序。它基于Erlang虚拟机&#xff08;BEAM&#xff09;&#xff0c;因其高并发性和容错能力而广受欢迎。近年来&#xff0c;Elixir在Web开发&#xff08;特别是与P…...

看不懂scatter、gather的来

1.torch.scatter 这是out-of-place版本&#xff08;相对于in-place版本&#xff09;&#xff0c;它会返回一个新的张量。 torch.Tensor.scatter_ 就是in-place版本&#xff0c;它直接修改自身&#xff0c;返回的也是自身 Tensor.scatter_(dim, index, src, *, reduceNone) →…...

系统思考—问题分析

爱因斯坦说过&#xff1a;“如果我有1小时拯救世界&#xff0c;我会花55分钟去确认问题为何&#xff0c;只用5分钟寻找解决方案。” 这个看似简单的道理&#xff0c;却蕴藏着解决复杂问题的智慧。真正的问题&#xff0c;往往隐藏在现象的背后。解决问题的关键&#xff0c;不在…...

【C】编译与链接

在本文章里面&#xff0c;我们讲会讲解C语言程序是如何从我们写的代码一步步变成计算机可以执行的二进制指令&#xff0c;并最终执行的。C语言程序运行主要包括两大步骤 -- 编译和链接&#xff0c;接下来我们就来一一讲解。 目录 1 翻译环境和运行环境 2 翻译环境 1&#…...

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…...

深入探索OceanBase分布式数据库理论:开启数据管理新篇章

《深入探索OceanBase分布式数据库理论&#xff1a;开启数据管理新篇章》 在当今数字化转型风起云涌的时代&#xff0c;数据已然成为企业最为宝贵的资产之一。随着数据量呈爆炸式增长、业务场景愈发复杂多元&#xff0c;传统的集中式数据库在应对高并发、海量数据存储与处理时逐…...

如何用VS调试不属于解决方案的EXE和DLL程序-使用PDB和EXE文件-根据exe|pdb|源码文件进行调试分析

文章目录 1.问题2.基本点3.方法步骤3.1.新建一个空的解决方案3.2.构建源码项目3.3.添加pdb文件目录3.4.调试目标exe 4.源码断点 1.问题 如果你手里有一个现成的EXE, 以及EXE相关联PDB文件, 还有相关联的CPP文件和H文件. 你如何用VS调试? (当然你可以选择WinDbg.不过这里就讨论…...

2. CSS的元素显示模式

2.1什么是元素显示模式 作用&#xff1a;网页的标签非常多&#xff0c;在不同地方会用到不同类型的标签&#xff0c;了解他们的额特点可以更好的布局我们的网页。 元素显示模式就是元素&#xff08;标签&#xff09;以什么方式进行显示&#xff0c;比如<div>自己占一行…...

marktext 开源markdown安装

https://github.com/marktext/marktext 该 markdown 的免费安装&#xff0c; 在mac os 上 安装时&#xff0c; 出现无法安装的情况 使用如下的命令可以&#xff0c; 可以进行使用 https://github.com/marktext/marktext/issues/2983 This isn’t the recommended command si…...

/src/utils/request.ts:axios 请求封装,适用于需要统一处理请求和响应的场景

文章目录 数据结构解释1. 核心功能2. 代码结构分析请求拦截器响应拦截器 3. 改进建议4. 总结 console.log(Intercepted Response:, JSON.stringify(response));{"data": {"code": 0,"msg": "成功","data": {"id":…...

蓝桥杯 第十五届 研究生组 B题 召唤数学精灵

问题描述&#xff1a; 数学家们发现了两种用于召唤强大的数学精灵的仪式&#xff0c;这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。累加法仪式 A(n) 是将从 1 到 n 的所有数字进行累加求和&#xff0c;即&#xff1a;A(n)12⋯n累乘法仪式 B(n) 则是将从 1 到 n 的所…...

四种编译方式(make、cmake、configure、autogen.sh)

文章目录 一、make特征编译步骤(make)样例编译二、cmake特征编译步骤(cmake --> make)样例编译三、configure特征编译步骤(./configure --> make)样例编译四、autogen.sh特征编译步骤(./autogen.sh --> ./configure --> make)样例编译总结一、make 特征 …...

Cursor 实战技巧:好用的提示词插件Cursor Rules

你好啊&#xff0c;见字如面。感谢阅读&#xff0c;期待我们下一次的相遇。 最近在小红书发现了有人分享这款Cursor提示词的插件&#xff0c;下面给各位分享下使用教程。简单来说Cursor Rules就是可以为每一个我们自己的项目去配置一个系统级别的提示词&#xff0c;这样在我们…...

mysql事务及隔离机制

mysql总结 mysql事务特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; 并发访问数据库造成的问题&#xff1a; 脏读&#xff1a;读到…...

《护网行动与数字时代:如何应对日益复杂的网络威胁?》

什么是护网 1.什么是护网行动 护网行动是由公安部牵头组织的网络安全攻防演练活动&#xff0c;旨在评估和提升企事业单位的网络安全防护能力。 具体来说&#xff0c;护网行动通过模拟真实的网络攻击场景&#xff0c;组织攻防双方进行对抗演练&#xff0c;以检测企事业单位网…...

1月9日星期四今日早报简报微语报早读

1月9日星期四&#xff0c;农历腊月初十&#xff0c;早报#微语早读。 1、上海排查47家“俄罗斯商品馆”&#xff1a;个别店铺被责令停业&#xff0c;立案调查&#xff1b; 2、西藏定日县已转移受灾群众4.65万人&#xff0c;检测到余震646次&#xff1b; 3、国家发改委&#x…...

科大讯飞前端面试题及参考答案 (下)

除了 echarts 还了解其它画图工具吗? 除了 Echarts,还有不少优秀的画图工具可供选择使用。 Highcharts:它是一款功能强大且应用广泛的图表绘制工具,支持多种常见的图表类型,像柱状图、折线图、饼图、散点图等,同时也能创建较为复杂的图表,比如仪表盘图表、极坐标图等。H…...

linux创建服务,实现程序异常退出自启

以启动java程序进行示例,其他程序也可按照该方式进行配置 [Unit] DescriptionMy Java Service Afternetwork.target[Service] WorkingDirectory/opt/myapp # 设置你的 jar 文件所在目录 ExecStart/usr/bin/java -jar myapp.jar # 替换为你的 jar 启动命令 Restartalways Re…...

linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail

之前提到过linux的几个重要哲学思想&#xff0c;使用纯文本文件保存软件的配置信息是其中之一&#xff0c;所以大多数情况下&#xff0c;我们对整个系统的操作&#xff0c;都是通过编辑它的配置文件来完成&#xff0c;那也就意味着&#xff0c;处理文本文件是我们作为系统管理员…...

Springboot3巧妙运用拦截器阻断xss攻击

Springboot3巧妙运用拦截器阻断xss攻击 什么是xss跨站脚本攻击类型简单示例解决方法拦截器代码使用demo 什么是xss 人们经常将跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;缩写为CSS&#xff0c;但这会与层叠样式表&#xff08;Cascading Style Sheets&#xff…...

leetcode 2551. 将珠子放入背包中

题目如下 数据范围 示例 题目的意思是将一个长度为n的数组weight(简称w)分成k个小数组,同时计算这些小数组的边界和。 设i (0 < i < n - 1) 首先我们假设已经找到最大分数序列即划分的小数组最优 令 j1,j2,j3.....jk为这些小数组的左端点(不包括第一个小数组)。 则有…...

【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。

??个人主页&#xff1a;哈__ 期待您的关注 目录 一、ShardingSphere简介 ?1.Sharding-JDBC 2.Sharding-Proxy? 3.Sharding-Sidecar&#xff08;TBD&#xff09;? 二、为什么用到ShardingSphere? 三、数据分片 四、SpringBoot整合ShardingSphere 1.创建我们的数据…...

Python中的ast.literal_eval:安全地解析字符串为Python对象

Python中的ast.literal_eval&#xff1a;安全地解析字符串为Python对象 什么是ast.literal_eval&#xff1f;为什么说它是“安全”的&#xff1f; 如何使用ast.literal_eval&#xff1f;示例1&#xff1a;将字符串转换为列表示例2&#xff1a;将字符串转换为字典示例3&#xff…...

前端用json-server来Mock后端返回的数据处理

<html><body><div class"login-container"><h2>登录</h2><div class"login-form"><div class"form-group"><input type"text" id"username" placeholder"请输入用户名&q…...

【linux】文件与目录命令 - mv

文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 mv 命令用于移动或重命名文件和目录&#xff0c;是 Linux 系统中管理文件的重要工具之一。它既能移动文件到指定路径&#xff0c;也能重命名文件或目录。 1. 基本用法 语法&#xff1a; mv [选项] 源文件 目标文件 mv…...

OSPF - LSA对照表

LSA的三要素&#xff0c;如何唯一表示一条LSA  Type&#xff1a;表示是几类的LSA  Link-id&#xff1a;这个比较特殊&#xff0c;不同的LSA的Link-ID不同  Advertising router&#xff1a;谁产生的LSA 常用的就是1、2、3、4、5、7型LSA 点击蓝字跳转LSA详细介绍(持续更新中…...

Mongodb基础sqL

------------------------------------------数据库------------------------------ (2).查看所有数据库 show dbs (3).选择数据库&#xff0c;如果不存在则隐式创建这个数据库 use 数据库名 ------------------------------------------集合------------------------------ …...

uniapp开发u-icon图标不显示问题

uniapp开发图标用u-icon不显示&#xff0c;换成uv-icon就可以了 插件市场从这里下载&#xff1a;uv-ui 破釜沉舟之兼容vue32、app、h5、小程序等多端&#xff0c;灵活导入&#xff0c;利剑出击 - DCloud 插件市场 组件库看这个&#xff1a;介绍 | 我的资料管理-uv-ui 是全面兼…...

宁德时代2025年Verify入职测评语言理解及数字推理真题SHL题库汇总、考情分析

宁德时代社招Verify入职测评对薪酬有着重要影响&#xff0c;其规定正确率达到80%才能顺利通过测评。这体现了公司对人才专业素养与能力的严格要求&#xff0c;旨在筛选出真正符合岗位需求的优秀人才。测评内容涵盖了专业知识、技能运用、逻辑思维等多方面&#xff0c;只有综合能…...

Spring Data Elasticsearch简介

一、Spring Data Elasticsearch简介 1 SpringData ElasticSearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎。它底层封装了Lucene框架,可以提供分布式多用户的全文搜索服务。 Spring Data ElasticSearch是SpringData技术对ElasticSearch原生API封装之后的产物,它通…...

即插即用,无缝集成各种模型,港科大蚂蚁等发布Edicho:图像编辑一致性最新成果!

文章链接&#xff1a;https://arxiv.org/pdf/2412.21079 项目链接&#xff1a;https://ezioby.github.io/edicho/ 亮点直击 显式对应性引导一致性编辑&#xff1a;通过将显式图像对应性融入扩散模型的去噪过程&#xff0c;改进自注意力机制与分类器自由引导&#xff08;CFG&…...

鸿蒙开发(29)弹性布局 (Flex)

概述 弹性布局&#xff08;Flex&#xff09;提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 容器默认存在主轴与交叉轴&#xff0c;子元素默认沿主轴排列&#xff0c;子元素在主轴方…...

华为 Sensor 省电策略调研

华为EMUI 9.0.0.187&#xff08;C00E57R1P15&#xff09; 无该功能 华为EMUI 9.1.0.321&#xff08;C00E320R1P1&#xff09; 之后有sensor管控 一、华为 Sensor 省电策略 1. Sensor 类别只配置非唤醒类Sensor 2. 手机静止情况&#xff0c;应用不可见时达到1分钟&#xff0…...

Kotlin语言的网络编程

Kotlin语言的网络编程 Kotlin作为一种现代的编程语言&#xff0c;其简洁、安全和高效的特性使得在开发各种应用时得到广泛认可。尤其是在网络编程方面&#xff0c;Kotlin凭借其与Java的高度兼容性以及丰富的库支持&#xff0c;使得网络操作变得更加简单易用。本文将详细探讨Ko…...

redis:安装部署、升级以及失败回退

安装部署 一、准备工作 1. 检查系统要求 确保你的服务器满足 Redis 的基本要求: 操作系统:支持的 Linux 发行版(如 Ubuntu, CentOS)内存:至少 4GB(根据实际应用需求调整)CPU:单核或多核 CPU磁盘空间:足够的磁盘空间用于数据存储和日志记录2. 更新系统软件包 在开始…...

3. ML机器学习

1.人工智能与机器学习的关系 机器学习是人工智能的一个重要分支&#xff0c;是人工智能的一个子集。它无需显式编程&#xff0c;而是通过数据和算法使机器能够自动学习和改进&#xff0c;从而实现智能行为。机器学习依赖于算法来识别数据中的模式&#xff0c;并通过这些模式做出…...

在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库 Three.js&#xff1a;一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer&#xff1a;一个Vue插件&#xff0c;它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles&#xff1a;一个用于处理3D Tiles格式数据的Vue插件&#xff0c;可以用来…...

用户使用LLM模型都在干什么?

Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析&#xff0c;主要发现及相关情况如下&#xff1a; 使用用途分布 软件开发主导&#xff1a;在各类使用场景中&#xff0c;软件开发占比最高&#xff0c;其中编码占 Claude 对话的 15% - 25%&#xff0c;网页和移动应…...