Scala的函数

前文已经提到Scala变量的用法,现在聊聊函数。在Scala里,函数的定义很简单。例如:

def add(x: Int, y: Int): Int = {
    x + y
}

Scala的函数和Python一样,以def开头,然后是函数名add,最后指定函数的参数,这里Scala的类型推断就不灵了,需要在冒号后面指定传入的函数参数类型。add函数接受两个为Int类型的参数,返回一个Int类型的结果参数。花括号里是add函数的函数体,负责函数的具体实现。Scala的函数的返回值,不需要指明return。

当然这是最死板的写法,灵活的Scala衍生出了更多的函数定义方式:

  1. 当返回值不是类似于递归这种情况的话,Scala的编译器是可以自动推断出返回值的类型,而不需要特意指定。
def add(x: Int, y: Int) = {
    x + y
}
  1. 当函数只有一条语句时,也可以把花括号省略。
def add(x: Int, y: Int) = x + y

在讨论完Scala函数的定义以后,那么Scala是如何定义函数是一等对象的? 在函数式编程里,函数本身不仅仅可以被定义和调用,也可以被当作值传递。在此之前先引入lambda函数,Scala里称为函数字面量,如下:

scala> (x:Int) => x + 1
res0: Int => Int = <function1>

虽然这个函数字面量还不能使用,但之前已经提到过了,函数本身是可以被当作值传递的,所以可以把上述的函数自变量,传给一个变量:

val increaseOne = (x: Int) => x + 1

与Python的lambda函数只能接受表达式不一样,Scala的lambda函数可以像一般的函数定义体一样定义。

 val increaseOne = (x: Int) => {
       x + 1
    }

这样的用法推广开来,就演变成了下面的用法:

val lst = List(1, 2, 3, 4, 5)
lst.foreach((x:Int) => println(x))

按照Scala能省则省的性格,上面的可以省略为:

lst.foreach(println)

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Kevin-ZhangCG

排序算法总结

1783
来自专栏Albert陈凯

Scala之偏函数Partial Function

http://blog.csdn.net/bluishglc/article/details/50995939 从使用case语句构造匿名函数谈起 在Scal...

3229
来自专栏java一日一条

int 和 Integer 的区别与作用

int是JAVA八大基本数据类型(byte,shor,int,long,char,boolean,float,double)之一。 JAVA语言为八大基本数据...

2271
来自专栏用户3030674的专栏

java接口

接口中常量的修饰关键字:public,static,final(常量) 函数的修饰关键字:public,abstract 如果没有写全,系统在编译时会自动加上 ...

1122
来自专栏小二的折腾日记

day5(面向对象2)

向上转型,向上转型 千万不要出现这样的操作,就是将父类对象转换成子类类型。 我们能转换的是父类应用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换。 ...

501
来自专栏Java编程

Java提高篇——详解内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。

6390
来自专栏前端知识分享

第24天:js-函数变量声明提升

一、函数声明 1、自定义函数 function fun1(){ alert("我是自定义函数"); } fun2();//函数不调用,自己不执行 2、直接量声...

1061
来自专栏java达人

关于java传参

有一个比较经典的例子,如果你能说出此题的结果,说明你是java内存解析能手: public class Test1 { public static clas...

1907
来自专栏全沾开发(huā)

JavaScript中的比较运算符

JavaScript中的比较运算符 JavaScript中的比较运算符粗略的可以分为两种: 相等运算符(==、===、!==)这些 ...

3487
来自专栏一“技”之长

Swift中构造方法的解析 原

      构造方法是一个类创建对象最先也是必须调用的方法,在Objective-C中,开发者更习惯称这类方法为初始化方法。在Objective-C中的初始化方...

862

扫码关注云+社区