Scala(二) —— 函数
try 表达式
var result = try{
Integer.parseInt("dog")
}catch{
case _ => 0
}finally{
println("excute")
}
match 表达式
val code = 3
var result = code match{
case 1 => "one"
case 2 => "two"
case _ => "others"
}
求值策略
- Call By Value
- 对函数实参求值,且仅求值一次
- Call By Name
- 函数实参每次在函数体内被用到时都会求值
def foo(x:Int,y: => Int):Int={
x * x
}
def loop():Int = loop
函数
(1)匿名函数
匿名函数定义格式 形参列表 => {函数体}
(2)柯里化函数
把具有多个参数的函数转换为一条函数链,每个节点上都是单一参数
例子1:
def add(x:Int)(y:Int) = x + y
var add1 = add(1)_
add1(5) 等同于 add(1)(5)
def add2 = add(2)_
add2(6)等同于add(2)(5)
例子2
def fun(f:Int => Int)(a:Int):Int={
f(a)
}
fun(x=>x*x)(5) //等同于 f(x) = x*x ;x = a;a=5;
(3)尾递归
覆盖当前记录,而不是在栈中创建新的函数
@annotation.tailrec
def fun(n:Int,m:Int):Int={
if(n <= 0) m
else fun(n-1,m*n)
}
@annotation.tailrec
def fun1(n:Int,m:Int):Int={
if(n == 1) m
else fun(n-1,m+n)
}
例子1,计算f(x),a-b的求和
该例子涉及到的知识点有函数柯里化、尾递归
final def find(f:Int => Int)(a:Int)(b:Int):Int={
@annotation.tailrec
def loop(n:Int,acc:Int):Int={
if(n > b){
acc
}else{
loop(n+1,acc+f(n));
}
}
loop(a,0)
}
Scala(二) —— 函数的更多相关文章
- scala(二) Future执行逻辑解读
在scala中是没有原生线程的,其底层使用的是java的Thread机制.但是在scala中对java Thread进行了封装,实现了更便于操作线程的Future. 官方文档: Futures pro ...
- Python进阶(二)----函数参数,作用域
Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...
- scala(二)
一.映射 1.Scala映射就是键值对的集合Map.默认情况下,Scala中使用不可变的映射. 如果想使用可变集合Map,必须导入scala.collection.mutable.Map (导包 ...
- Scala学习——函数高级操作
scala函数高级操作 一.字符串高级操作 多行字符串和插值 package top.ruandb.scala.Course06 object StringApp { def main(args: A ...
- Scala学习——函数
一.函数的定义(def) object FunctionApp { //定义函数:方法体内最后一行为返回值,不需要使用return def add(a:Int,b:Int):Int={ a + b } ...
- Scala的函数,高阶函数,隐式转换
1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...
- 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) { echo $var; ...
- scala匿名函数
package com.ming.test import scala.math._ object AnonymousFunc { def valueAtOneQuarter(f:(Double)=&g ...
- Scala应用函数
我们使用“_” 来代替单个的参数,实际上你也可以使用“_”来代替整个参数列表,比如说,你可以使用 print _ 来代替 println (_). someNumbers.foreach(printl ...
随机推荐
- docker 设计原理
自从上次更新博客截至目前已经8个多月之久,在这大半年里面,我自己经历了好多,换了工作,换了定位,从之前的小运维,到现在负责整个运维部的工作,需要自己协调的事情更多了,最大的成长是可以通过自己的见解对公 ...
- SElinux安全子系统---学习
SElinux是一个强制访问控制的安全子系统,是为了让各个服务进程都受到约束,只能获取到属于自己的资源 SElinux有三种配置模式: 1:enforcing--强制启动安全配置策略,拦截不合法的请求 ...
- java课程之团队开发冲刺阶段1.5
一.总结昨天进度 1.昨天由于时间较少,没有太多的时间来进行学习Sqlite 二.遇到的困难 1.由于最终的程序需要调用本地的数据库,所以我们需要在安装程序的时候就需要直接附带安装一个本地的数据库到手 ...
- Vue 过滤器的使用
Vue官方文档是这样说的:Vue过滤器用于格式化一些常见的文本. 在实际项目中的使用: 定义过滤器 在src定义一个filter.js文件,里面定义过滤器函数,在最后要使用 exprot defaul ...
- Mysql postgresql 行列转换
一.第一种 原数据表 转换后 DROP TABLE IF EXISTS tempdynamic; CREATE TEMPORARY TABLE tempdynamic ( SELECT p.fsPay ...
- js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法:
js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法: var s = new MyString('hello'); s.length; s[0]; // " ...
- ueditor编辑器多图上传为什么顺序打乱了
我上一个版本用的是ueditor1.3.6,自从1.4.2版以后,“前端上传模块统一改用webuploader”,ueditor在多图上传一直考虑漏掉了图片顺序的问题. 我的网站在用户上传图片文章的时 ...
- Data Center手册(1):架构
如图是数据中心的一个基本架构 最上层是Internet Edge,也叫Edge Router,也叫Border Router,它提供数据中心与Internet的连接. 连接多个网络供应商来提供冗余可靠 ...
- leetcode-数组-子集
一.题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- Tomcat 集群中 实现session 共享的三种方法
前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持 ...