Scala函数字面量简化写法

Scala提供了多种方法来简化函数字面量中多余的部分,比如前面例子中filter方法中使用的函数字面量,完整的写法如下:

 (x :Int ) => x +1

首先可以省略到参数的类型,Scala可以根据上下文推算出参数的类型,函数定义可以简化为:

 (x) => x +1

这个函数可以进一步去掉参数的括号,这里的括号不起什么作用:

 x => x +1

Scala 还可以进一步简化,Scala允许使用”占位符”下划线”_”来替代一个或多个参数,只要这个参数值函数定义中只出现一次,Scala编译器可以推断出参数。比如

scala> val someNumbers = List ( -11, -10, - 5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)

scala> someNumbers.filter(_ >0)
res0: List[Int] = List(5, 10)

可以看到简化后的函数定义为 _ > 0 ,你可以这样来理解,就像我们以前做过的填空题,“_”为要填的空,Scala来完成这个填空题,你来定义填空题。

有时,如果你使用_来定义函数,可能没有提供足够的信息给Scala编译器,此时Scala编译器将会报错,比如,定义一个加法函数如下:

scala> val f = _ + _
<console>:7: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
       val f = _ + _
               ^
<console>:7: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
       val f = _ + _

Scala 编译器无法推断出_的参数类型,就报错了,但如果你给出参数的类型,依然可以使用_来定义函数,比如:

scala> val f = (_ :Int ) + ( _ :Int)
f: (Int, Int) => Int = <function2>

scala> f (5,10)
res1: Int = 15

因为_替代的参数在函数体中只能出现一次,因此多个“_”代表多个参数。第一个“_”代表第一个参数,第二个“_”代表第二个参数,以此类推。

时间: 2024-10-22 23:30:53

Scala函数字面量简化写法的相关文章

Scala函数字面量

Scala中函数为头等公民,你不仅可以定义一个函数然后调用它,而且你可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量.下面的例子为一个简单的函数字面量(参考整数字面量,3 为一整数字面量). (x :Int ) => x +1 这是个函数字面量,它的功能为+1. 符好 => 表示这个函数将符号左边的东西(本例为一个整数),转换成符号右边的东西(加1). 函数字面量为一个对象(就像3是个对象),因此如果你愿意的话,可以把这个函数字面量保持在一个变量中.这个变量

从函数字面量发现函数式编程

从函数字面量发现函数式编程 版权声明:本文由本人撰写并发表于2015年3月下半月的<程序员>杂志,原文题目<从字面量发现函数式编程>,本文版权归<程序员>杂志所有,未经许可不得转载. 引言 我相信很多像我一样初次接触函数式编程的程序员来说,对于"函数字面量"这个概念会感到迷惑和不解.伴随着深入地学习,在清晰地理解了这个概念之后,我进行了一些梳理和回溯,作为函数式编程思想延伸到最基层的语言元素,我深刻地觉得"函数字面量"这个概念的背

Javascript——对象字面量常用写法以及规则

对象字面量 对象字面值是封闭在花括号对({})中的一个对象的零个或多个"属性名-值"对的(元素)列表.你不能在一条语句的开头就使用对象字面值,这将导致错误或产生超出预料的行为, 因为此时左花括号({)会被认为是一个语句块的起始符号. 以下是一个对象字面值的例子.对象car的第一个元素(译注:即一个属性/值对)定义了属性myCar:第二个元素,属性getCar,引用了一个函数(即CarTypes("Honda")):第三个元素,属性special,使用了一个已有的变量

简写函数字面量(function literal)

如果函数的参数在函数体内只出现一次,则可以使用下划线代替: val f1 = (_: Int) + (_: Int) //等价于 val f2 = (x: Int, y: Int) => x + y list.foreach(println(_)) //等价于 list.foreach(e => println(e)) list.filter(_ > 0) //等价于 list.filter(x => x > 0) 原文地址:https://www.cnblogs.com/l

字面量和构造函数

字面量和构造函数 JavaScript中的字面量模式更加简洁.有表现力,而且在定义对象时不容易出错.本章将会讨论字面量,包括对象.数组和正则表达式字面量,以及为什么字面量要比等价的内置构造函数(如Object().Array()等)要更好.本章还会介绍JSON格式,JSON是使用数组和对象字面量的形式定义的一种数据交换格式.本章还会讨论自定义构造函数,包括如何强制使用new以确保构造函数正确执行. 为了方便使用字面量而不是构造函数,本章还会补充一些知识,比如内置包装构造函数Number().St

Objective-C 之 Literals(字面量)

今天整理一下关于Objective-C Literals的内容,Literals翻译成字面量或者字面值,就是直接被写到源代码中的值.这不是一个陌生的概念,我们在写程序的时候能频繁的见到.我们很早就见过NSString 字面量了: NSString *greeting = @"Hello World"; 它的语法很简单,上面的代码就是通过在C字符串的前面加上@符号创建了一个NSString对象greeting,整段代码看起来简洁易懂,如果没有直接量语法,那么创建这个greeting可能就

在JavaScript里的“对象字面量”是什么意思?

字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量.字面量分为字符串字面量(string literal ).数组字面量(array literal)和对象字面量(object literal),另外还有函数字面量(function literal).示例:var test="hello world!";"hello world!"就是字符串字面量,test是变量名.

Swift数组字面量

1 可以用一个数组字面量来初始化一个数组,简单地把一个或多个值放在一起就可以了.数组字面量的写法是一行用逗号隔开的值,并在行的两端用一对方括号包起来: 2 [value 1, value 2, value 3] 3 4 下面的例子创建了一个存放String类型值,名为shoppingList的数组: 5 var shoppingList: String[] = ["Eggs", "Milk"] 6 // shoppingList 用两个元素完成初始化 7 根据Str

JavaScript字面量

JavaScript字面量(literal)又称直接量,在JavaScript代码中用来表示一个固定的值,它可以理解为“代码文字表面上的意义的常量”.它是仅表示“自己”意义的一个实例. 譬如 var a=1; 这段声明变量的语法中1就是数字字面量,表示数字1. 字面量可分为数字字面量.字符串字面量.数组字面量.表达式字面量.对象字面量.函数字面量. 数字(Number)字面量 可以是整数或者是小数,或者是科学计数(e). 3.14 1001 123e5 字符串(String)字面量 是使用单引号