scala case 常用简写

本文深入探讨Scala中的样本序列,解析其作为函数字面量的替代使用方法,对比一般函数字面量的区别,介绍多入口点及参数列表特性,并通过实例说明如何应用于常见操作如foreach、map、reduce。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

case样本序列
先看一段代码

    val func1: Int => Int = {
        case x  => 1
    }
1
2
3
等号的右边是{case x => 1},一对花括号包裹着一个case语句。这样的用法看到过很多次,但是很少有资料解释为什么可以这样用。查阅过很多资料,最终在《programming in Scala》(scala编程:黄海旭,高宇翔译)里出现过一段话。“样本序列可以用在出现函数字面量的任何地方。实质上,样本序列就是函数字面量,而且更普遍。函数字面量有一个入口点和参数列表,但是样本序列可以有多个入口点,每个都有自己的参数列表。”这三句话总结起来有两点:

样本序列可以替代函数字面量使用
样本序列和一般函数字面量的不同在于有多个入口点,每个入口点有自己独立的参数列表
现在就可以解释为什么在代码中可以这样使用了,首先 val func1: Int => Int 声明了不可变变量要被赋值一个Int => Int 类型的函数字面量,所以{case x => 1}可以被赋值给func1。
这种用法在scala里十分常见。大家一定经常使用的函数如foreach():

         def foreach[U](f: A => U) { while (hasNext) f(next()) }
1
大家习惯性的使用方式是:

        Seq(1, 2, 3).foreach{case x => println(x)}
1
这是因为foreach要求使用一个A => U类型的函数字面量作为参数,所有可以使用样本序列{case x => println(x)}作为参数。而上面的代码其实是一种缩写,实际上应该是:

        Seq(1, 2, 3).foreach({case x => println(x)}) //比上面的代码多了一对括号()
1
此外,如大家常用的操作,如map,reduce都可以用样本序列替换函数字面量。
以上展示的都是单行样本序列,然后还有多行样本序列,原理都是一样的。

一个问题?
scala中还有一个不常用的写法:

        val func2: Int => Int = {
            x => 1
        }
1
2
3
这种写法和上面的上面的写法几乎一模一样,唯独少量一个case,不知道是不是样例类的一种简写。如果有知道的还请解释一下。我个人觉得有可能是闭包.

之前留了一个疑问,现在对这个疑问做下解释:
其实上面的例子很简单,只是一直陷入思维惯性,觉得很高深。我们在scala里是可以直接定义匿名函数的,如:


现在我们考虑给这个匿名函数赋给一个值:

    val func2 = (x:Int) => 1+x
1
然后大家应该记得scala的代码块,就是花括号连同它包裹的地方是有值得,他的值就是最后一句代码所标识的值,那{(x:Int) => 1+x}的值就是(x:Int) => 1+x,那么上一句代码就可以表示为:

    val func2 = {
            (x:Int) => 1+x
    }
1
2
3
然后只需要声明一下fun2的类型:

        def func2:Int => Int = {
            (x:Int) => 1+x 
        }
1
2
3
然后做一下缩写,如去掉花货号里的()和x的数据类型声明:

        def func2:Int => Int = {
            x: => 1+x
        }
1
2
3
现在就得到了最初的形式。为了进一步验证正确性,可以尝试在花括号里加一些代码,发现也是可行的。

        def func2: Int => Int = {
            val y = 10
            x: => 1 + x + y
        }
1
2
3
4
然后我们尝试在代码块的最后加一些代码:

        def func2: Int => Int = {
            val y = 10
            x => 1 + x + y
            val z = 0
            z
        }
1
2
3
4
5
6
发现这样也是可行的,按理说这样应该不可以,因为代码块的最后一句是一个z代码的是一个Int类型,并不是 Int => Int类型的函数字面量。这是因为上面呢的代码产生了视觉误差,实际上应该是下面这样的。

        def func2: Int => Int = {
            val y = 10
            x =>1 + x + y
                val z = 0
                z
        }
最后两句代码是属于Int=>Int这个方法的方法体的
            x =>{1 + x + y
                val z = 0
                z}
1
2
3
4
5
6
7
8
9
10
然后尝试把最后两句代码从里面的函数的方法体里取出来,就会报错:

        def func2: Int => Int = {
            val y = 10
            { x => 1 + x + y }
            val z = 0
            z
        }
1
2
3
4
5
6
Error:(9, 13) type mismatch;
found : Int
required: Int => Int
z
--------------------- 
作者:齐梦星空 
来源:优快云 
原文:https://blog.youkuaiyun.com/weixin_37275456/article/details/89672756 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>好的,用户想了解Scala编程中常用的函数及其用法。首先,我需要回忆一下Scala的核心函数特性,尤其是函数式编程的部分。Scala的函数可以独立存在,作为参数或返回值,这点和Java不同,应该重点说明。 接下来,根据用户提供的引用资料,引用[1]提到基本函数和高阶函数,引用[3]和[4]涉及集合的常用函数,引用[2]讨论错误处理的函数类型。需要把这些内容组织起来,分成几个部分,比如基本函数、高阶函数、集合操作函数、错误处理函数等。 基本函数部分,要说明如何定义函数,包括匿名函数和带参数的函数。比如用val定义函数变量,或者def定义方法。可能需要举例子,比如加法的函数,或者匿名函数的写法。 然后是高阶函数,这部分很重要,因为这是函数式编程的核心。需要解释高阶函数的概念,比如map、filter、reduce这些,每个都要举例说明。比如用map处理集合中的每个元素,filter筛选符合条件的元素,reduce进行累积操作。用户提供的引用[4]里有map和filter的例子,可以参考那个代码片段,说明如何使用。 集合操作函数部分,可能需要详细列举常用的方法,比如map、filter、reduce、fold、flatMap等。每个方法给出简短说明和示例代码。比如flatMap用于展平嵌套集合,可以举一个字符串拆分成字符列表的例子。 错误处理函数部分,引用[2]提到了Option、Either、Try,需要分别解释它们的用途和用法。比如Option用于处理可能存在或不存在的值,Either表示两种可能的结果,Try用于捕获异常。每个类型给出简单的例子,比如使用Some和None,或者Try块中的代码。 用户提供的引用[4]里有一个案例,使用map和filter统计分数及格次数,这个可以作为实际案例来展示函数组合的应用。需要详细解释这段代码的逻辑,如何转换数据,过滤,计算数量等。 最后,生成相关问题的时候,需要围绕用户可能进一步想知道的内容,比如高阶函数的具体应用场景,集合函数的性能比较,或者错误处理的最佳实践。确保问题覆盖用户可能感兴趣的扩展话题。 检查是否有遗漏的部分,比如是否覆盖了所有用户提到的引用内容,特别是集合常用函数和错误处理部分。同时,要确保所有数学公式或代码块使用正确的格式,比如行内代码用$...$,独立代码块用```包裹,符合用户给出的系统级指令。 需要验证代码示例的正确性,例如Scala的语法是否正确,尤其是高阶函数和集合操作的部分。比如在map和filter的例子中,是否使用了正确的Lambda表达式语法。例如arr.map(t => (t._1, t._2.filter(_ >= 60).size))是否正确,这里的filter参数是否简写正确。 最后,确保回答结构清晰,分点明确,每个部分都有示例代码和解释,帮助用户逐步理解Scala中的常用函数及其使用方法。同时,正确添加引用标识,比如在错误处理部分引用[^2],在集合操作部分引用[^3]和[^4]。</think>### Scala常用函数总结及使用方法 --- #### 一、基本函数定义与使用 Scala中的函数可以独立存在,无需依附于类或对象,支持作为参数和返回值[^1]。 1. **普通函数**: ```scala def add(a: Int, b: Int): Int = a + b ``` 2. **匿名函数**: ```scala val multiply = (x: Int, y: Int) => x * y ``` --- #### 二、高阶函数(Higher-Order Functions) 高阶函数以函数为参数或返回值,是函数式编程的核心[^1]。 1. **`map`**:对集合元素逐一转换 ```scala val nums = List(1, 2, 3) val squared = nums.map(x => x * x) // 结果:List(1, 4, 9) ``` 2. **`filter`**:筛选满足条件的元素 ```scala val evenNumbers = nums.filter(_ % 2 == 0) // 结果:List(2) ``` 3. **`reduce`**:通过二元操作聚合元素 ```scala val sum = nums.reduce((a, b) => a + b) // 结果:6 ``` --- #### 三、集合常用函数 集合操作是Scala的核心功能之一,以下是常用方法[^4]: 1. **`flatMap`**:先映射后展平 ```scala val words = List("Hello", "World") val chars = words.flatMap(_.toList) // 结果:List(H, e, l, l, o, W, o, r, l, d) ``` 2. **`fold`**:带初始值的聚合 ```scala val total = nums.fold(10)(_ + _) // 结果:16(初始值10 + 1+2+3) ``` 3. **`groupBy`**:按条件分组 ```scala val grouped = nums.groupBy(n => if (n % 2 == 0) "even" else "odd") // 结果:Map(odd -> List(1, 3), even -> List(2)) ``` --- #### 四、错误处理函数 函数式编程中常用`Option`、`Either`、`Try`处理异常[^2]: 1. **`Option`**:表示可能存在或不存在的值 ```scala def findUser(id: Int): Option[String] = if (id == 1) Some("Alice") else None ``` 2. **`Try`**:捕获异常并返回结果 ```scala import scala.util.Try val result = Try("123".toInt) // Success(123) ``` 3. **`Either`**:表示两种可能的结果 ```scala def parse(input: String): Either[String, Int] = Try(input.toInt).toOption.toRight("Invalid number") ``` --- #### 五、实际应用案例 **统计学生及格次数**(引用自[^4]): ```scala val scores = Array(("zhangsan", Array(100, 120, 50, 45, 34)), ("zhaosi", Array(90, 98, 34, 32, 13))) val passCounts = scores.map { case (name, arr) => (name, arr.filter(_ >= 60).size) } // 结果:Array((zhangsan,2), (zhaosi,2)) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值