在scala中实现打印从10到3:
1.使用breakable-break的方式跳出循环
导入的类是:import scala.util.control.Breaks._
object demo2 {
def main(args:Array[String]):Unit = {
import scala.util.control.Breaks._
var num=10
breakable{
/*for(x <- num to 1 by -1){
if(x<3) break
print(x+"\t")
}*/
for(x<- num to 1 by -1 if x>=3 ) print(x+"\t")
}
}
}
2.使用loop.breakable-loop.break的方式跳出循环
导入的类是:import scala.util.control.Breaks
object demo2 {
def main(args:Array[String]):Unit = {
import scala.util.control.Breaks
val num=10
val loop = new Breaks
loop.breakable(
for(x <- num to 3 by -1){
if(x<3) loop.break
print(x+"\t")
}
)
}
}
使用变量接收循环语句的结果集合(yield关键字),遍历集合
object demo2 {
def main(args:Array[String]):Unit = {
var i=100;
val resValue=for(x<-1 to i ; if x%2==0;if x%5==0) yield x
println(resValue)
println("-------------------")
for(i <- resValue){
print(i+"\t")
}
}
}
结果显示:
Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
-------------------
10 20 30 40 50 60 70 80 90 100
Process finished with exit code 0
if流程控制:
判断i的值和10的大小关系,打印
object demo2 {
def main(args:Array[String]):Unit = {
val i=10
if(i>10){
println(i+"的值大于10")
}else if(i==10){
println(i+"的值等于10")
}else{
println(i+"的值小于10")
}
}
}
练习:判断i的值和10是否相等,相等加1,不相等加2,并打印
object demo2 {
def main(args:Array[String]):Unit = {
val i=10
val j=if(i==10) i+1 else i+2
println(j)
}
}
定义代码块:
代码块的结果是在代码块中计算的最后一行
object demo2 {
def main(args:Array[String]):Unit = {
val x=10
val y={
print("代码块\t")
x+1
}
println(y)
println("---------------")
val y2={
x+1;println("代码块")
}
println(y2)
}
}
打印结果:
代码块 11
---------------
代码块
()
Process finished with exit code 0
循环语句
在for循环中:
1 to 10 可以取到10
1 until 10 取不到10
object demo2 {
def main(args:Array[String]):Unit = {
var x=0
println("-------while循环------")
while(x<10){
print(x+"\t")
x+=1
}
x=0
println("\n-------do-while循环------")
do{
print(x+"\t")
x+=1
}while(x<10)
println("\n-------for循环(1 to 10)------")
for(x <- 1 to 10) print(x+"\t")
println("\n-------for循环(1 until 10)------")
for(x <- 1 until 10) print(x+"\t")
}
}
打印结果:
-------while循环------
0 1 2 3 4 5 6 7 8 9
-------do-while循环------
0 1 2 3 4 5 6 7 8 9
-------for循环(1 to 10)------
1 2 3 4 5 6 7 8 9 10
-------for循环(1 until 10)------
1 2 3 4 5 6 7 8 9
Process finished with exit code 0
练习:使用循环打印九九乘法口诀表
外层循环速度慢,内层循环速度快
object demo2 {
def main(args:Array[String]):Unit = {
for(x<-1 until 10){
for (y<-1 to x){
print(s"$x*$y=${x*y}\t")
}
println()
}
}
}
打印结果:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
使用循环打印等腰三角形:
object demo2 {
def main(args:Array[String]):Unit = {
val num=5
for(i<-1 to num){
for (j<-num to i by -1){
print(" ")
}
for(k<-1 to 2*i-1) print("*")
println()
}
}
}
显示结果:
*
***
*****
*******
*********
Process finished with exit code 0
练习:打印一个中间掏空的等腰三角形
在原来等腰三角形的基础上,第一行和最后一行要正常打印,其余每一行只打印第一个*
和最后一个*
其余打印空格
object demo2 {
def main(args:Array[String]):Unit = {
val num=5
for(i<-1 to num){
for (j<-num to i by -1){
print(" ")
}
for(k<-1 to 2*i-1){
if(i==1 || i==num || k==1 ||k==2*i-1) print("*") else print(" ")
}
println()
}
}
}
打印结果:
*
* *
* *
* *
*********
Process finished with exit code 0
元组
与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素。
元组的值是通过将单个的值包含在圆括号中构成的。
object demo3 {
def main(args:Array[String]):Unit ={
var tupleDemo=("hello","kb09",1.2,3,"world","a")
println(tupleDemo)
println("tupleDemo._1的值:"+tupleDemo._1)
println("tupleDemo._2的值:"+tupleDemo._2)
println("tupleDemo._3的值:"+tupleDemo._3)
println("tupleDemo._4的值:"+tupleDemo._4)
println("tupleDemo._5的值:"+tupleDemo._5)
println("tupleDemo._6的值:"+tupleDemo._6)
}
}
元组的遍历方式
tupleDemo.productIterator.foreach(println)
tupleDemo.productIterator.foreach(x=> println(s"value:$x"))
显示结果:
value:hello
value:kb09
value:1.2
value:3
value:world
value:a
元组的定义方式
var tupleDemo2 = new Tuple5("ab","bc","cd","de","ef")
或者:
object demo3 {
def main(args:Array[String]):Unit ={
def mike="mike"->5->6
println(mike._1)
println(mike._2)
println(mike.getClass)
}
}
显示结果:
mike的类型是:Tuple2 ((String,Int),Int)
(mike,5)
6
class scala.Tuple2
Process finished with exit code 0
object demo3 {
def main(args:Array[String]):Unit ={
val tp1=("zhangsan","nanjing",19)
val(name,address,age)=tp1
println(s"姓名:$name,地址:$address,年龄:$age")
}
}
显示结果:
姓名:zhangsan,地址:nanjing,年龄:19
数组的定义
object demoArray {
def main(args:Array[String]):Unit={
var arr:Array[String]=new Array[String](3)
arr(0)="hello"
arr(1)="world"
arr(2)="scala"
println(arr(0))
println("--------arr2--------")
var arr2=Array("kb09","luoxin","gree")
println(arr2(1))
}
}
显示结果:
hello
--------arr2--------
luoxin
函数的定义和使用
object FunctionDemo {
def main(args:Array[String]):Unit={
//函数的定义和使用
//输入两个整数返回较小数的值
def minValue(a:Int,b:Int):Int=if(a>b) b else a
//输入两个整数和符号,如果是加号则求和,其余求差
def sumValue(a:Int,b:Int,c:String):Int=if(c.equals("+")) a+b else a-b
}
}
使用递归的方式写出阶乘
object FunctionDemo {
def main(args:Array[String]):Unit={
//阶乘
def jiecheng(a:Int):Int={
if(a==1){
a
}else{
a*jiecheng(a-1)
}
}
println(jiecheng(8))
}
}
通过指定参数名字,传递参数值
object FunctionDemo {
def main(args:Array[String]):Unit={
def showMsg(name:String,age:Int):Unit={
println(s"hello:$name,age:$age")
}
//按照参数顺序传递参数
showMsg("zhangsan",18)
//通过指定参数名字,传递参数值
showMsg(age=18,name="zhangsan")
}
}
参数的长度未知,通过*来表示,可以传入多个参数
object FunctionDemo {
def main(args:Array[String]):Unit={
//参数的长度未知,通过*来表示,可以传入多个参数
def showMsg2(name:String,s:String*)={
println(name)
for(str<-s){
println(str)
}
}
showMsg2("kb09","abc","hello")
}
}
匿名函数
object FunctionDemo {
def main(args:Array[String]):Unit={
def sum(a:Int,b:Int):Int=a+b
//匿名函数
val aa = (a:Int,b:Int) => a+b
println("aa(32,31)的结果为"+aa(32,31))
val bb=aa
println("bb(66,88)的结果为"+bb(66,88))
val cc=(a:Int,b:Int)=>"abc"
println("cc(11,22)的结果为"+cc(12,21))
val sum1:(Int,Int)=>Int = (a:Int,b:Int)=>a+b
val sum2:(Int,Int)=>Int = aa
println("sum1(1,3)的结果为"+sum1(1,3))
println("sum2(12,23)的结果为"+sum2(12,23))
}
}
显示结果:
aa(32,31)的结果为63
bb(66,88)的结果为154
cc(11,22)的结果为abc
sum1(1,3)的结果为4
sum2(12,23)的结果为35
函数作为参数进行传递
object FunctionDemo {
def main(args:Array[String]):Unit={
//函数作为参数进行传递
def fun(a:Int,b:Int):Int =a+b
def fun1(a:Int,b:Int):Int=a-b
def fun2(a:Int,b:Int):Int=a*b
def funTest(f:(Int,Int)=>Int,s:String):String={
val resultValue=f(1000,3000)
s+resultValue
}
var resultValue=funTest(fun,"你的薪水是:")
println(resultValue)
println("-----使用匿名函数作为参数传递-----")
resultValue=funTest((a:Int,b:Int)=>a+b,"您的薪水是:")
println(resultValue)
}
}
显示结果:
你的薪水是:4000
-----使用匿名函数作为参数传递-----
您的薪水是:4000
函数作为返回值
object FunctionDemo {
def main(args:Array[String]):Unit={
//函数作为返回值
//不传参数,返回一个签名是 (String,String)=>String 的函数
def funTest2():(String,String)=>String={
def fun2(str1:String,str2:String):String={
str1+"##"+str2+"&&"
}
fun2
}
println(funTest2()("aa", "bb"))
}
}
显示结果:
aa##bb&&
练习:先传递一个字符串,如果长度大于5,传递两个整数相加,如果字符串长度小于5,传递两个整数相减,如果字符串长度等于5,传递两个整数相乘
object FunctionDemo {
def main(args:Array[String]):Unit={
//先传递一个字符串,如果长度大于5,传递两个整数相加
//如果字符串长度小于5,传递两个整数相减
//如果字符串长度等于5,传递两个整数相乘
def funTest2(s:String):(Int,Int)=>Int={
if(s.length>5){
def funAdd(a:Int,b:Int):Int= a+b
funAdd
}else if(s.length<5){
def funMinus(a:Int,b:Int):Int=a-b
funMinus
}else{
def funMultiply(a:Int,b:Int):Int=a*b
funMultiply
}
}
val intValue = funTest2("Hello")(100,200)
println(intValue)
}
}
练习:传入一个数字,如果能被3整除,返回加法,否则返回减法
object FunctionDemo {
def main(args:Array[String]):Unit={
//传入一个数字,如果能被3整除,返回加法,否则返回减法
def getFunByNum(num:Int):(Int,Int)=>Int ={
if(num%3==0){
(a:Int,b:Int)=>a+b
}else{
(a:Int,b:Int)=>a-b
}
}
println(getFunByNum(4)(100, 200))
}
}
函数作为参数传递进来,函数作为返回值返回出去
相同需求改进练习:传入一个数字,如果能被3整除,返回加法,否则返回减法
object FunctionDemo {
def main(args:Array[String]):Unit={
//函数作为参数传递进来,函数作为返回值返回出去
//传入一个数字,如果能被3整除,返回加法,否则返回减法
def funMsg(f:(String)=>Int,str:String):(Int,Int)=>Int ={
val intNum=f(str)
if(intNum%3==0){
(a:Int,b:Int)=>a+b
}else{
(a:Int,b:Int)=>a-b
}
}
val resultNum = funMsg(
(a: String) => {if (a.equals("上海")) 3 else 1}, "上海")(100, 500)
println(resultNum)
}
}
练习:先传入一个数字,判断是否能被3整除,再传入两个整数,进行两数相加/相减,判断结果值是否大于3000,再传递字符串,打印不同的打印语句
object FunctionDemo {
def main(args:Array[String]):Unit={
//传入一个数字,判断除以3是否等于0,如果等于0相加,但是不返回两个数相加的和,
// 如果金额大于3000,传一个名字进来,再返回一个空函数,打印一句话
def funTest3(a:Int):(Int,Int)=>(String)=>Unit ={
if(a%3==0){
def funAdd(a:Int,b:Int):(String)=>Unit ={
if(a+b>3000){
(x:String) => {
println("恭喜"+x+"你的收入很高")
}
}else{
(x:String) => {
println("很遗憾"+x+"再加把力")
}
}
}
funAdd
}else{
def funMinus(a:Int,b:Int):(String)=>Unit ={
if(a-b>3000){
(x:String)=>{
println(x+"你是一个非常节约的人")
}
}else{
(x:String)=>{
println(x+"????你已经入不敷出了")
}
}
}
funMinus
}
}
funTest3(7)(5000,7000)("zhangsan")
}
}
函数柯理化
object FunctionDemo {
def main(args:Array[String]):Unit={
//函数柯里化
def fun(a:Int,b:Int,c:Int,d:Int):Int={a+b+c+d}
def fun1(a:Int,b:Int)(c:Int,d:Int):Int={a+b+c+d}
def fun2(a:Int)(b:Int)(c:Int)(d:Int):Int={a+b+c+d}
def fun3(a:Int,b:Int,c:Int)(d:Int):Int={a+b+c+d}
def fun4(a:Int)(b:Int,c:Int,d:Int):Int={a+b+c+d}
println(fun(1, 2, 3, 4))
println(fun1(1, 2)(3, 4))
println(fun2(1)(2)(3)(4))
println(fun3(1, 2, 3)(4))
println(fun4(1)(2, 3, 4))
}
}
隐式参数
object FunctionDemo {
def main(args:Array[String]):Unit={
//隐式参数 同一个类型再一个作用域只能有一个
implicit var a:Int=10
implicit var str:String="hello"
def fun5(a:Int,b:Int)(c:Int=5):Int={a+b+c}
def fun6(a:Int,b:Int)(implicit c:Int=5):Int={a+b+c}
def fun7(a:Int,b:Int)(implicit c:Int=5,str:String):Int={
println(str)
a+b+c
}
//优先级:传参 > 隐式函数 > 默认值
println("fun5(10, 10)()的结果是:"+fun5(10, 10)())
println("fun6(10,10)(20)的结果:"+fun6(10,10)(20))
println("fun6(10, 10)的结果:"+fun6(10, 10))
println("fun6(10,10)()的结果"+fun6(10,10)())
println("fun7(10,10)的结果"+fun7(10,10))
println("fun7(10,10)(c=123,str=\"abc\")的结果是:"+fun7(10,10)(c=123,str="abc"))
}
}
显示结果:
fun5(10, 10)()的结果是:25
fun6(10,10)(20)的结果:40
fun6(10, 10)的结果:30
fun6(10,10)()的结果25
hello
fun7(10,10)的结果30
abc
fun7(10,10)(c=123,str="abc")的结果是:143
模式匹配和样例类
object demoMatch {
def method1(x:Int):String={
if(x==1){
"one"
}else if(x==2){
"two"
}else{
"many"
}
}
//模式匹配:值
def match1(x:Int):String=x match{
case 1 => "one"
case 2 => "two"
case _ => "many"
}
//模式匹配类型:
def match2(x:Any):Unit=x match{
case 1 => println("输入的值是1")
case i:Int => println("输入的值类型为Int类型,值为"+i)
case s:Int => println("输入的值类型为String类型,值为"+s)
case _ => println("我不知道是啥")
}
//样例类
case class Teacher(name:String,age:Int)
def match3(teacher:Teacher):Unit=teacher match{
case Teacher("gree",19) => println("hello gree")
case Teacher("wenwen",21) => println("hello wenwen")
case x:Teacher =>{println("hello"+x.name)}
}
def main(args: Array[String]): Unit = {
println(match1(2))
match2(1)
val t=Teacher("gree",19)
val t1=Teacher("gree",19)
if(t==t1){
println("是同一个人")
}else{
println("不是同一个人")
}
match3(t)
}
}
显示结果:
two
输入的值是1
是同一个人
hello gree