scala 编程函数,方法与数组(其二)
scala 函数与方法!
1,在实际中,方法存在于对象中,用来处理对象的数据。
2,scala 之中的所有的算术运算实际上是专门的方法,只是绑定到类型之中。 2+3 实际上是调用了值为2的一个Int 的加法方法,并提供参数3,返回值为5
object Hello{ def main(args: Array[String]): Unit = { moth(8, 4) println(function0(1, 2)) println(m(f1)) println(powwer(2, 8)) // 递归函数 println(greet(name = "hello world! ")) println(fn(12, 12, 12)) println(fn1(1)(2)) //两个输入参数分解到参数组之中去! println(add()) // 调用匿名函数 a() println(funinfun(3)) } // 定义方法 "=" 可以省略, 省略之后,无论方法体最后一行计算结果是什么都会丢弃,返回Unit def add(){ println("无返回值") } // Unit 表示无返回数值 // 定义一个方法需要 def 指定 // 方法的返回值可以不写,但是递归必须指定返回值 def moth(a :Int,b :Int) ={ println("Unit 表示无返回数值! ") } // 函数可以像数据类型一样传递和操作! val function0 = (x:Int,y:Int) => x+y // 函数作为形参传递方法!在方法之中调用函数(来自形参) def m(f:(Int,Int)=>Int) =f(2,6) val f1 = (x:Int,y:Int)=> x+y // 将方法转换成函数! def f2 = m _ // k 的 w次幂 def powwer(k:Int,w:Int):Long ={ if (w>=1) k *powwer(k,w-1) else 1 } // 有默认的参数 一般重要参数在前 其他参数在后 def greet(prefix :String ="H",name:String)=s"$prefix$name" // 可变参数 求和计算(items 是 WrappedArry) def fn(items:Int*):Int ={ var total = 0 // var 才能达到可变的效果! for (i <- items) total += i total } //参数组 def fn1(x:Int)(y:Int) = if(x>y) x else y // 定义匿名函数 val a = (name:String) =>{ println("hello world!" + name) } // 函数之间的嵌套 def funinfun(num:Int)={ def fun(num:Int): Int ={ if(num==1) 1 else num*fun(num-1) } fun(num) } // 原始函数 def showlog(d:Date,log:String): Unit ={ println("date is "+d+", log is "+log) } val data = new Date() showlog(data,"a") showlog(data,"b") showlog(data,"c") showlog(data,"d") // 使用偏应用函数达到省略部分传参的效果 val fun1 = showlog(data:Date,_:String) fun1("a") fun1("b") fun1("c") fun1("d") // 高阶函数 传入的函数作为逻辑运算 def fun_in(a:Int,b:Int): Int ={ a+b } def fun_out(f:(Int,Int)=>Int,s:String)={ val result = f(100,244) result + "~" + s } println(fun_out(fun_in, "hello")) // 高阶函数 函数的返回是函数 // (String,String) =>String 指的是 fun_retu 的返回类型 def fun_retu(a:Int,b:Int): (String,String) =>String={ val resu = a*b def fun2(s:String,s1:String): String ={ s +"@" +s1+"$"+resu } fun2 } println(fun_retu(10, 20)("hello", "world")) // 高阶函数 函数的传入与返回都是函数 def fun_in_resu(f:(Int,Int)=>Int): (String,String) =>String ={ val results = f(8,9) def fun4(s1:String,s2:String): String={ s1+"@"+s2+"!"+results } fun4 } fun_in_resu((a:Int,b:Int)=>{ a+b }) }
关于数组的说明:
1,Arry 类型是 scala 封装的一个 java 数组类
2,scala 数组是通过 ()来访问的 每次遍历有时候是调用的 类型的 toString()方法,但是只是打印数组例外
3,可变数组是一种静态类
4,数组,元组,映射等默认都是不可变的 ,需要引入可变的包!
package day01 object Test2{ def main(args: Array[String]): Unit = { // 不需要调用类 默认是定长数组 val arr = new Array[Int](8) //默认 0填充 // println(arr) // 是一个引用 // println(arr.toBuffer) //转换成数组缓冲! 也可以for循环遍历 val arrstr = new Array[String](8) //默认是 null填充 // println(arrstr) // 打印的是一个引用! // println(arrstr.toBuffer) //转换成数组缓冲 val arr2 =Array("python","scala","java")//在此处可以看出 调用的是静态类 不需要 new // println(arr2.toBuffer) // println(arr2(2)) //使用的 () 不是[] //scala 生成一个动态类需要引用包 import scala.collection.mutable.ArrayBuffer val arr3 = ArrayBuffer[Int]() arr3 += 1 //数组追加 1 arr3+=(2,3,4) //追加多个元素 使用元组 或者数组 arr3++=Array(5,6) arr3++=ArrayBuffer(7,8,9) arr3.insert(0,-1,0) // 在下标 0前处加入 -1 和 0 arr3.remove(2,3) // 2(包括)下标开始删除 删除三个 for(i<-arr3) println(i) //使用 for 打印每一个值 for (i <- (0 until arr3.length).reverse) println(arr3(i)) //反转取值 val yie = for (i <- arr3) yield i //此时是生成一个新的数组 val arr4 = Array(arr3.max,arr3.sum,arr3.sorted) //求和与最大值,排序升序生成的数组 println(arr4.toBuffer) // println(yie) // println(arr3.toBuffer) } }