IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> scala基础篇 -> 正文阅读

[Java知识库]scala基础篇

标识符

???? 有新增关键字,如yield成为scala新关键字,则在scala调用时,则应由Thread.yield()改成Thread.`yield`来使用

引用

引入单个类:import java.util.Date;

引入包下所有类:import java.util._;

引入包下若干类(选择器)importjava.util.{Date,HashSet,HashMap}

引入类后重命名:import java.util.{Date => OldDate}

隐藏包下的部分成员:import java.util.{Date=>_,_} 不引入括号的

默认包引入为:java.lang._、scala._、Predef._,默认引入的包的情况下其内类的使用均不需要加上包名。

差异

? AnyRef:是所有引用类的基础,即除了值类型之外

AnyVal:是所有值类型的基类,包括9个值类型

scala.Double?

scala.Float?

scala.Long?

scala.Int?

scala.Char?

scala.Short?

scala.Byte?

scala.Unit

scala.Boolean

变量

常量

使用val来声明常量

val constString:String="hero";

val constString="new_hero";

????????? 变量

使用var来声明变量

var varString:String="name";

var varString="new_name";

?

变量类型声明

显式声明类型

var?variableName : DataType [= Initial Value]

val constName: DataType [= Initial Value]

隐式声明类型

var myString="HelloWorld";

var myInt=1;

批量变量声明

var a,b=10;

println(a+b);?

访问修饰符??

???? scala访问修饰符包括private,protected,public,对象的访问级别默认都是public

private

仅在包含了成员定义的类或对象内部可见

在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员

protected

比java的protected更严格,除了子类可以访问,同包下的类是不能访问的

作用域保护

????? 通过private[x]或protected[x]来实现,可以修饰包、类、单例对象。

private[x],即为"这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。

protected[x],即为"这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是protected。

运算符

a++ 在scala中不能使用,只能用 a=a+1

for形式定义

for(x <- Range ){

?? ??? ?statement(s);

}

以上语法中,Range?可以是一个数字区间表示?i to j?,或者?i until j。左箭头 <- 用于为变量 x 赋值。

i to j? [i,j]

i until j? [i,j)

这里只能从小到大,不能倒着排

  • 集合循环

object TestControlSentence {

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

??? val stringList = List("one","two","three","four","five","six");

??? for(str <- stringList){

????? println(str)

??? }

? }

}

  • 循环中带过滤

object TestControlSentence {

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

??? val stringList = List("one","two","three","four","five","six");

??? for(str <- stringList if(str!="two" && str!="three")){

????? println(str)

??? }

? }

}

  • for循环加入yield返回结果集合
    • 定义形式

var retValList?= for{ var x <- List

?? ??? ?if condition1; if condition2...

} yield x

注意大括号中用于保存变量和条件,retValList?是变量, 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。

object TestControlSentence {

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

??? val stringList = List("one", "two", "three", "four", "five", "six");

??? var resultList = for {

????? str <- stringList if (str != "two" && str != "three")

??? } yield str;

??? for (temp <- resultList) {

????? println(temp)

??? }

? }

}

str 放入resultlist,

  • 闭包示例

object TestCloseFunction {

? var factor = 1000

? def salaryMoney(i: Int): Int = {

??? return i * factor

? }

? def main(args: Array[String]) {

??? println("月薪salaryMoney(8) value = " + salaryMoney(8))

??? println("月薪salaryMoney(10) value = " + salaryMoney(10))

??? TestCloseFunction.factor = 10000;

??? println("年薪salaryMoney(8) value = " + salaryMoney(8))

??? println("年薪salaryMoney(10) value = " + salaryMoney(10))

? }

}

  • 使用示例
    • 不可变字符串创建? ???? ??? ?? ??

object TestString {

? var message = "过年好!";

? var messageV2: String = "过年好!";

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

??? println(message);

??? println(messageV2);

? }

}

  • 可变字符串创建(StringBuilder)

def main(args: Array[String]) {

? val stringBuilder = new StringBuilder;

??? stringBuilder += '1'

??? stringBuilder ++= "234"

??? stringBuilder.append("567")

??? stringBuilder.append('8')

? println("stringBuilder is : " + stringBuilder.toString);

}

  • 可变字符串创建(StringBuilder)

object TestStringBuilder {

? def main(args: Array[String]) {

??? val stringBuilder = new StringBuilder;

??? stringBuilder += '1'

??? stringBuilder ++= "234"

??? stringBuilder.append("567")

??? stringBuilder.append('8')

??? println("stringBuilder is : " + stringBuilder.toString);

? }

}

  • 字符串连接concat或是+符号

?def main(args: Array[String]) {

??? var str = "12345678";

??? var str2 = "9";

??? println("str.concat(str2)=" + str.concat(str2));

??? println("str.concat(str2)=" + str + str2);

? }

  • 常用函数
    • 求字符串长度length方法

?def main(args: Array[String]) {

??? var str="12345678";

??? println("str length()="+str.length());

? }

  • 字符串格式化printf

?def main(args: Array[String]) {

??? var name = "天亮教育";

??? var location = "石家庄";

??? var work = "大数据技能培训";

??? var age=21;

??? printf("我是%s,我在%s,我做%s,我今年%d岁了",name,location,work,age);

? }

  • 数组定义
    • 静态数组

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

??? var programLanguageArray = Array("java", "python", "c++", "c", "php")

??? for (program <- programLanguageArray) {

????? println(program);

??? }

? }

  • 动态数组

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

??? var programLanguageArray = new Array[String](5)

??? //??? var programLanguageArray:Array[String] = new Array[String](5)

??? programLanguageArray(0) = "java";

??? programLanguageArray(1) = "python";

??? programLanguageArray(2) = "c++";

??? programLanguageArray(3) = "c";

??? programLanguageArray(4) = "php";

??? for (program <- programLanguageArray) {

????? println(program);

??? }

? }

    • 多数数组定义与应用

import Array.ofDim;

object TestMultiArray{

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

??? var myMatrix = ofDim[Int](4, 4)

??? // 创建二维方阵

??? for (i <- 0 to myMatrix.length - 1) {

????? for (j <- 0 to myMatrix(i).length - 1) {

??????? myMatrix(i)(j) = (i + 1) * (j + 1);

????? }

??? }

?? ?

??? // 输出二维方阵

??? for (i <- 0 to myMatrix.length - 1) {

????? for (j <- 0 to myMatrix(i).length - 1) {

??????? print(" " + myMatrix(i)(j));

????? }

????? println();

??? }

? }

}

1 2 3 4

?2 4 6 8

?3 6 9 12

?4 8 12 16

  • 数组合并? ??concat

import Array.concat;

object TestArray {

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

??? var numberList1 = Array(1, 2, 3, 4)

??? var numberList2 = Array(5, 6, 7, 8)

??? var mergeList = concat(numberList1, numberList2)

??? // 输出所有数组元素

??? for (x <- mergeList) {

????? println(x)

??? }

? }

}

  • 创建区间数组
    • 区间数组说明
      • range(start,end,step) 方法来生成一个区间范围内的数组
      • range(start,end,step) 方法最后一个参数为步长,默认为 1
      • 是半包区间,包含起始值,不包括结束值,即start<=x<end

import Array.range;

object TestArrayRange {

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

??? var numberList1 = range(1, 5, 2)

??? var numberList2 = range(1, 5)

?? ?

??? println("手动设置步长为2")

??? // 输出所有数组元素-numberList1

??? for (x <- numberList1) {

????? println(x)

??? }

??? println("采用默认步长值,即为1")

??? // 输出所有数组元素-numberList2

??? for (x <- numberList2) {

????? println(x)

??? }

? }

}

函数传名调用

    • 概念说明
      • 传值调用:先计算参数表达式的值,再应用到函数内部,把=>去掉即可,即按原始的方式
      • 传名调用:将未计算的参数表达式直接应用到函数内部,用=>来设置传名调用
    • 应用示例-传值

object TestCallByValue {

? def main(args: Array[String]) {

??? delayedCalculator(transmitMe());

? }

? def transmitMe(): String = {

??? println("我在transmitMe方法中!")

??? return "transmitMe返回值";

? }

? def delayedCalculator(t: String): Unit = {

println(" delayedCalculator方法--开始")

println("正式调用传过来的函数: " + t)

??? println(" delayedCalculator方法--结束")

? }

}

?先是完成了里面的方法,然后再完成外面的

    • 应用示例-传名? 延迟计算

object TestCallByName {

? def main(args: Array[String]) {

??? delayedCalculator(transmitMe());

? }

? def transmitMe(): String = {

??? println("我在transmitMe方法中!")

??? return "transmitMe返回值";

? }

? def delayedCalculator(t: => String): Unit = {?????

??? println(" delayedCalculator方法--开始")

??? println("正式调用传过来的函数: " + t)

??? println(" delayedCalculator方法--结束")

? }

}

什么时候用到什么时候再传结果,注意println第二行括号内的t,这里会用到前面

就是delayedCalculator(t: => String) 中的 =>

指定函数名调用 指定名字就行

可变(不定长)参数的函数

?? Java?

????? Public static void test(String... args){

For(String arg:args){

?? System.out.println(arg);

}

}

Public static void main(String[] args){

Test(“one”,”two”,”three”);

}

Scala

? object TestNonFixParas {

? def main(args: Array[String]) {

??? printAllParasValue("one", "two", "three", "four");

? }

? def printAllParasValue(paras: String*): Unit = {

??? for (temp <- paras) {

????? println(temp);

??? }

? }

}

使用String*来解决

  • 默认参数值函数

object TestDefaultParaFunction {

? def main(args: Array[String]) {

??? println("完全使用默认值的返回值 : " + salaryMoney());

??? println("部分使用默认值的返回值 : " + salaryMoney(10));

??? println("部分使用默认值的返回值 : " + salaryMoney(10,10000));

? }

? def salaryMoney(a: Int = 5, unit: Int = 1000): Int = {

??? return a * unit

? }

}

A unit都是默认的

如果不传,则是按默认计算,传一个则是将值传给a

  • 递归函数

object TestRecusive {

? def main(args: Array[String]) {

??? var n=4

??? println(n+"的阶乘为="+myFactorial(n))

? }

? def myFactorial(n: Int): Int = {

??? if (n <= 1)

????? return 1

??? else

????? return n * myFactorial(n - 1)

? }

}

  • 高阶函数
    • 概念说明
      • 第一种:将一个函数当做另外一个函数的参数,即参数为函数的函数
      • 第二种:返回值是函数的函数,即高阶函数可以产生函数
    • 应用示例
      • 参数为函数的函数

object TestHighFunctionByTransmitFunctionPara {

? def main(args: Array[String]) {

??? delayedCalculator(transmitMe());

? }

? def transmitMe(): String = {

??? println("我在transmitMe方法中!")

??? return "transmitMe返回值";

? }

? def delayedCalculator(t: => String): Unit = {

??? println(" delayedCalculator方法--开始")

??? println("正式调用传过来的函数: " + t)

??? println(" delayedCalculator方法--结束")

? }

}

      • 返回值是函数的函数

object TestHighFunctionByRetFunction {

? def main(args: Array[String]) {

??? var mySalaryFun=multiplyBy(1000);

??? println(mySalaryFun(10));

? }

? def multiplyBy(salaryUnit:Int)=(x:Int)=>salaryUnit*x

}

这里salaryUnit会得到首先传入的参数1000,然后再进行mySalaryFun(10),也就是乘10的操作

内嵌函数

    • 概念介绍
      • 函数内定义函数,定义在函数内的函数称之为局部函数,亦称内嵌函数
    • 应用示例?

object TestEmbedFunction {

? def main(args: Array[String]) {

??? var msg="HelloWorld";

??? printMessage(msg);

? }

? def printMessage(msg: String): Unit = {

??? def printMessageInner(msg: String): Unit = {

????? println(msg);

??? }

??? printMessageInner(msg);

? }

}

匿名函数

    • 概念介绍
      • 没有函数名称的函数
      • 使代码更简洁,用=>来表示,左侧是参数列表,右侧是函数体
    • 应用示例? ??? ??
      • 匿名用法(使值自增+1的函数实现)

函数定义:

var inc = (x:Int) => x+1

函数使用:

var x = inc(8)+1

      • 正常写法(使值自增+1的函数实现)

正常定义:

def incFunction(x: Int): Int = {

??? return x + 1;

}

函数使用:

var x=incFunction(8)+1

这个结果为10

  • 偏应用函数
    • 概念说明
      • 不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数
      • 实现方法:绑定函数的一部分参数,非绑定部分用"_"代替,从而形成偏应用函数去使用
    • 应用示例
      • 传统方法实现(向某人问好)

import java.util.Date

object TestPartialParasFunction {

? def main(args: Array[String]) {

??? val name="张三"

??? sayHello(name, "上午好")

??? Thread.sleep(1000)

??? sayHello(name, "中午好")

??? Thread.sleep(1000)

??? sayHello(name, "晚上好")

? }

? def sayHello(name: String, message: String) = {

??? println(name + "----" + message)

? }

}

      • 偏应用函数实现(向某人问好)

def main(args: Array[String]) {

??? val name="张三"

??? val partialSay=sayHello(name,_:String);

??? partialSay("上午好")

??? Thread.sleep(1000)

??? partialSay("中午好")

??? Thread.sleep(1000)

??? partialSay("晚上好")

? }

? def sayHello(name: String, message: String) = {

??? println(name + "----" + message)

? }

  • 函数柯里化
    • 概念说明
      • 将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
      • 提高了使用方法的灵活性
    • 应用举例
      • 传统实现add方法定义

def add(x: Int, y: Int) = x + y;

  • 传统实现add方法使用

def main(args: Array[String]) {

??? println(add(3,4));

? }

def add(x: Int, y: Int) = x + y;

  • 柯里化实现add方法定义

def add(x:Int)(y:Int) = x + y

  • 柯里化实现add方法使用

object TestCurryingFunction {

? def main(args: Array[String]) {

??? //对应柯里化形式1的使用

??? var curryingAdd1 = add1(3)

??? //对应柯里化形式2的使用

??? var curryingAdd2 = add2(3)(_)

???

??? println(curryingAdd1(4));

??? println(curryingAdd2(4));

? }

? //柯里化形式1

? def add1(x: Int) = (y: Int) => x + y;

? //柯里化形式2

? def add2(x: Int)(y: Int) = x + y;

}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:16:21  更:2021-11-10 12:18:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:32:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码