Dart语法篇之函数的使用

1、位置参数

位置参数可以必需的也可以是可选

  • 无参数

//无参数类型-这是不带函数参数或者说参数列表为空
String getDefaultErrorMsg() => ‘Unknown Error!’;
//无参数类型-等价于上面函数形式,同样是参数列表为空
get getDefaultErrorMsg => ‘Unknown Error!’;
复制代码

  • 必需位置参数

//必需位置参数类型-这里的exception是必需的位置参数
String getErrorMsg(Exception exception) => exception.toString();
复制代码

  • 可选位置参数

//注意: 可选位置参数是中括号括起来表示,例如[String error]
String getErrorMsg([String error]) => error ?? ‘Unknown Error!’;
复制代码

  • 必需位置参数和可选位置参数混合

//注意: 可选位置参数必须在必需位置参数的后面
String getErrorMsg(Exception exception, [String extraInfo]) => ‘ e x c e p t i o n . t o S t r i n g ( ) − − − {exception.toString()}--- exception.toString()extraInfo’;
复制代码

2、命名参数

命名参数始终是可选参数。为什么是命名参数,这是因为在调用函数时可以任意指定参数名来传参。

  • 可选命名参数

//注意: 可选命名参数是大括号括起来表示,例如{num a, num b, num c, num d}
num add({num a, num b, num c, num d}) {
return a + b + c + d;
}
//调用
main() {
print(add(d: 4, b: 3, a: 2, c: 1));//这里的命名参数就是可以任意顺序指定参数名传值,例如d: 4, b: 3, a: 2, c: 1
}
复制代码

  • 必需位置参数和可选命名参数混合

//注意: 可选命名参数必须在必需位置参数的后面
num add(num a, num b, {num c, num d}) {
return a + b + c + d;
}
//调用
main() {
print(add(4, 5, d: 3, c: 1));//这里的命名参数就是可以任意顺序指定参数名传值,例如d: 3, c: 1,但是必需参数必须按照顺序传参。
}
复制代码

  • 注意: 可选位置参数和可选命名参数不能混合在一起使用,因为可选参数列表只能位于整个函数形参列表的最后。

void add7([num a, num b], {num c, num d}) {//非法声明,想想也没有必要两者一起混合使用场景。所以

}
复制代码

3、关于可选位置参数[num a, num b]和可选命名参数{num a, num b}使用场景

可能问题来了,啥时候使用可选位置参数,啥时候使用可选命名参数呢?

这里给个建议: 首先,参数是非必需的也就是可选的,如果可选参数个数只有一个建议直接使用可选位置参数[num a, num b];如果可选参数个数是多个的话建议用可选命名参数{num a, num b}. 因为多个参数可选,指定参数名传参对整体代码可读性有一定的增强。

4、参数默认值(针对可选参数)

首先,需要明确一点,参数默认值只针对可选参数才能添加的。可以使用 = 来定义命名和位置参数的默认值。默认值必须是编译时常量。如果没有提供默认值,则默认值为null

  • 可选位置参数默认值

num add(num a, num b, num c, [num d = 5]}) {//使用=来赋值默认值
return a + b + c + d;
}
main() {
print(add(1, 2, 3));//有默认值参数可以省略不传 实际上求和结果是: 1 + 2 + 3 + 5(默认值)
print(add(1, 2, 3, 4));//有默认值参数指定传入4,会覆盖默认值,所以求和结果是: 1 + 2 + 3 + 4
}
复制代码

  • 可选命名参数默认值

num add({num a, num b, num c = 3, num d = 4}) {
return a + b + c + d;
}
main() {
print(add(100, 100, d: 100, c: 100));
}
复制代码

二、匿名函数(闭包,lambda)

在Dart中可以创建一个没有函数名称的函数,这种函数称为匿名函数,或者lambda函数或者闭包函数。但是和其他函数一样,它也有形参列表,可以有可选参数。

(num x) => x;//没有函数名,有必需的位置参数x
(num x) {return x;}//等价于上面形式
(int x, [int step]) => x + step;//没有函数名,有可选的位置参数step
(int x, {int step1, int step2}) => x + step1 + step2;没有函数名,有可选的命名参数step1、step2
复制代码

闭包在dart中的应用

闭包函数在dart用的特别多,单从集合中操作符来说就有很多。

main() {
List numbers = [3, 1, 2, 7, 12, 2, 4];
//reduce函数实现累加,reduce函数中接收的(prev, curr) => prev + curr就是一个闭包
print(numbers.reduce((prev, curr) => prev + curr));
//还可以不用闭包形式来写,但是这并不是一个好的方案,不建议下面这样使用。
plus(prev, curr) => prev + curr;
print(numbers.reduce(plus));
}
//reduce函数定义
E reduce(E combine(E value, E element)) {//combine闭包函数
Iterator iterator = this.iterator;
if (!iterator.moveNext()) {
throw IterableElementError.noElement();
}
E value = iterator.current;
while (iterator.moveNext()) {
value = combine(value, iterator.current);//执行combine函数
}
return value;
}
复制代码

三、箭头函数

在Dart中还有一种函数的简写形式,那就是箭头函数。箭头函数是只能包含一行表达式的函数,会注意到它没有花括号,而是带有箭头的。箭头函数更有助于代码的可读性,类似于Kotlin或Java中的lambda表达式->的写法。

main() {
List numbers = [3, 1, 2, 7, 12, 2, 4];
print(numbers.reduce((prev, curr) {//闭包简写形式
return prev + curr;
}));
print(numbers.reduce((prev, curr) => prev + curr)); //等价于上述形式,箭头函数简写形式
}
复制代码

四、局部函数

在Dart中还有一种可以直接定义在函数体内部的函数,可以把称为局部函数或者内嵌函数。我们知道函数声明可以出现顶层,比如常见的main函数等等。局部函数的好处就是从作用域角度来看,它可以访问外部函数变量,并且还能避免引入一个额外的外部函数,使得整个函数功能职责统一。

//定义外部函数fibonacci
int fibonacci(int n) {
//定义局部函数lastTwo
List lastTwo(int n) {
if(n < 1) {
return [0, 1];
} else {
var p = lastTwo(n - 1);
return [p[1], p[0] + p[1]];
}
}
return lastTwo(n)[1];
}
复制代码

五、顶层函数和静态函数

在Dart中有一种特别的函数,我们知道在面向对象语言中比如Java,并不能直接定义一个函数的,而是需要定义一个类,然后在类中定义函数。但是在Dart中可以不用在类中定义函数,而是直接基于dart文件顶层定义函数,这种函数我们一般称为顶层函数。最常见就是main函数了。而静态函数就和Java中类似,依然使用static关键字来声明,然后必须是定义在类的内部的。

//顶层函数,不定义在类的内部
main() {
print(‘hello dart’);
}

class Number {
static int getValue() => 100;//static修饰定义在类的内部。
}
复制代码

六、main函数

每个应用程序都有一个顶级的main()函数,它作为应用程序的入口点。main()函数返回void,所以在dart可以直接省略void,并有一个可选的列表参数作为参数。

//你一般看到的main是这样的
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

你不踏出去一步,永远不知道自己潜力有多大,千万别被这个社会套在我们身上的枷锁给捆住了,30岁我不怕,35岁我一样不怕,去做自己想做的事,为自己拼一把吧!不试试怎么知道你不行呢?

改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)**

[外链图片转存中…(img-PupS9XJy-1712256764231)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值