Scala 慕课网笔记

for循环

  val l = List("Tom", "Bob123", "WangMeng")       //> l  : List[String] = List(Tom, Bob123, WangMeng)
  for {
    s <- l
  } println(s)                                    //> Tom
                                                  //| Bob123
                                                  //| WangMeng
                                                  //| res0: <error> = ()
	for {
		s <- l
		if (s.length>3)
	}println(s)                               //> Bob123
                                                  //| WangMeng
	for {
		s <- l
		s1 = s.toUpperCase()
		if (s1 != "")
		if (s.length > 3)
	}yield(s1)                                //> res1: <error> = List(BOB123, WANGMENG)
	

	val result_try = try {
		Integer.parseInt("Cat")
	} catch {
		case _ => 3
	} finally {
		println("must be printed")
	}                                         //> must be printed
                                                  //| result_try  : Int = 3
		
	val code = 2                              //> code  : Int = 2
	val result_match = code match {
		case 1 => "one"
		case 2 => "two"
		case _ => "others"
	}                                         //> result_match  : String = two

使用_*转换参数列表

call by value/name

call by value: 对函数实参求值,且仅求值一次  x: Int
call by name: 函数实参每次在函数体内被用到时都会求值 y: => Int
 

      def bar (x: Int,y: => Int) = 1
      def loop(): Int = loop   // 递归      
      bar(1,loop)                   // 能执行,call by name开始不会执行loop
      bar(loop,1)   // 死循环,call by value需要先运行loop

  高阶函数

:用函数作为形参或者返回值的函数
    
    def operate(f: (Int,Int) => Int) ={
        f(4,4)
    }
    
    def greeting() = (name: String) => {"hello" + " " + name }
    
    // 上面的greeting()函数后面跟的是匿名函数:(形参列表) => {函数体}

  柯里化函数 

:把具有多个参数的函数转化为一条函数链,每个节点上是单一参数
    def curriedAdd(a: Int)(b: Int) = a + b
    curriedAdd(2)(2)
    var addOne = curriedAdd(1)_
    addOne(2)

递归函数
  

 def factorial(n: Int): Int =
        if (n <= 0) 1
        else n * factorial(n - 1)
    
    factorial(3)
    
    // 普通递归容易出现堆栈溢出。尾递归函数:所有递归形式的调用都出现在函数的尾部,当编译器检
    // 测到一个函数调用尾递归的时候,就覆盖当前的活动记录而不是在栈中去创建一个新的
    @annotation.tailrec
    def fac(n: Int,m: Int): Int =
        if (n<=0) m else fac(n-1,m*n)
        
    fac(4,1)   // 在worksheet里不出结果,在终端可以有结果

 6-2 list的高级使用
  

  val a = List(1,2,3)
    a.filter(x => x % 2 == 1)
    "99 my name is LH".toList.filter(x => Character.isDigit(x))
    "99 my name is LH".toList.takeWhile(x => x != 'n')  // 没有匹配到 'n' 一直输出

  6-3 map函数
  

val c = List("x","y","z")
  c.map(x => x.toUpperCase)   // (都是匿名函数  )等价于 c.map(_.toUpperCase)
             //双重List处理
    val d = List(a,List(4,5,6))
    d.map(_.filter(_ % 2 == 0))
    d.flatMap(_.filter(_ % 2 == 0))     // flatMap 将List合并

    6-4 reduceLeft 和  flodLeft

 List(1,2,3).reduceLeft((x,y) => x+y)
    List(1,2,3).reduce(_ + _)
    
    List(1,2,3).foldLeft(5)((x,y) => x+y)  // foldLeft用法x:第一次调用5,y调用1,再把x+y=6的结果放在(5)的位置作为返回;再x调用6,y调用2,依次把(1,2,3)遍历完,返回(5)位置的结果11

6-5 stream
    

 val stream = (1 to 10000000).toStream   // 相当于迭代器用到才会求值

 toupe 和 Map
  

  1 -> 2
    val t = (1,"ALice","Math",89.3)   // 访问方式
    //touple的应用
     def sumSq(in: List[Int]):(Int,Int,Int) = in.foldLeft((0,0,0))((x,y) => (x._1+1,x._2+y,x._3+y*y))
      sumSq(List(1,2,3))   //  (Int, Int, Int) = (3,6,14)

 map 相当于字典
    val p = Map(1 -> "David",3 -> "John")
    p(1)
    p.keys
    p.values
    p.contains(1)
    p.contains(12)
    p - 1
    p + (4 -> "Ammi")
    p ++  List(1->"a1",2->"bas")     // 一次加多个键值对
    p --  List(1,2)  // 一次减个键值对

    
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值