kotlin高阶函数实战&DSL入门
传统函数演示:
这里以电视节目“非诚勿扰”为例,男人去从一大堆美女当中挑选出自己中意的对象,比如台上有24位妹子,其档案如下:

接下来第一个男嘉宾出场啦,如下:

下面用代码来实现一下,比较简单:
先定义一个妹子的实体:

然后入库所有妹子的资料信息,这里直接用一个集合来表示,如下:

接着男嘉宾上场开始搜寻,第一个出场的只想找来自河南的妹子,用代码来满足需求如下:

上面的实现比较简单,也是第一时间能想到的,而查找某个地区妹子可能未来还有其它人需要使用,所以将其这个通用的行为封装到Girl中,如下:

这样就可以满足各种指定地区妹子的过滤了,如下:

传统需求实现的缺点:
接下来第二个男嘉宾出场啦,如下:

so easy嘛,再弄一个方法来根据年龄过滤,如下:

调用之:

接着第三个男嘉宾出场了,如下:

明显这位要求就多了,实现依然简单,基于之前的再copy改改就可以实现了,如下:

编译运行:

其中在kotlin中多个条件还可以这样写,如下:

ok,接着第四个男嘉宾出场了,如下:

貌似跟第三个男嘉宾的要求差不多,只不过这位是喜欢年纪大的,没关系,也可以轻松满足,只需基于第三个函数中加一个flag参数既可,如下:



接着还可能有以下其它需求的:

那是不是Girl这个类中存在大量的copy不断满足各种需求的代码,来一个需求就得增加一个对应的函数,可维护性就变得非常之差,那如何解决这类问题呢?就是用高阶函数,将其行为参数化,也就是方法传递的不再是值,而是具体的行为,其这在Java8中已经详细学习过了,下面就来在kotlin中也来学习下如何用高阶函数来更加便捷的解决上面各种各样的需求。
map,filter,groupBy,minBy,maxBy,find,any等:
对于什么是高阶函数在之前的学习中已经学过了,这里再总结一下:一个用函数作为参数或者返回值的函数,那下面通过一系列的实验来体会一下使用高阶函数的便捷性,还是以上面找妹子为例:
minBy、maxBy:
找年龄最大的妹子,先用传统的方式做肯定是需要这样做,如下:

比较繁琐,接着来看一下采用maxBy的高阶函数是如何做的:

其代码量一下就少了,那maxBy为啥是高阶函数叫?查看一下它的定义便知:

好,接下来需求变更,需要找出高度最高的妹子,利用了高阶函数之后,一切变得是那么的容易,如下:

那如果反过来找出最小的呢?那就改用minBy呗,如下:

filter:过滤特定条件
直接上代码,不多解释,用它来找年龄大于18、身高在168之上的妹纸,具体代码如下:

编译运行:
[Girl(name=笑笑, age=19, height=175, address=河南), Girl(name=玲儿, age=23, height=169, address=广东), Girl(name=环环, age=25, height=172, address=安微), Girl(name=胖嘟嘟, age=32, height=180, address=河北), Girl(name=乔乔, age=35, height=180, address=广东), Girl(name=月儿, age=25, height=178, address=吉林), Girl(name=花儿, age=21, height=183, address=山东), Girl(name=S小糖, age=49, height=190, address=新疆), Girl(name=棒棒糖, age=23, height=172, address=浙江)]
此时条件又发生变化了,需查找年龄大于18并且小于25、身高在168之上的妹纸,使用了高阶函数之后应对这些需求是如此容易,如下:

编译运行:
[Girl(name=笑笑, age=19, height=175, address=河南), Girl(name=玲儿, age=23, height=169, address=广东), Girl(name=花儿, age=21, height=183, address=山东), Girl(name=棒棒糖, age=23, height=172, address=浙江)]
另外看一下fiilter函数的定义:

map:
如果说要将妹子的所有名字都映射到一个集合里,利用map这个高阶函数做非常之简便,下面看下:

编译运行:
[依儿 : 18 , 笑笑 : 19 , 小百合 : 17 , michel : 22 , 猫咪 : 28 , 玲儿 : 23 , 环环 : 25 , 胖嘟嘟 : 32 , 乔乔 : 35 , 小可爱 : 27 , 一生有你 : 22 , 敏儿 : 28 , 月儿 : 25 , 花儿 : 21 , S小糖 : 49 , 悦悦 : 19 , 小可爱 : 29 , 紫琪 : 49 , 糖心 : 26 , 棒棒糖 : 23 , 猪猪侠 : 18 , 喵喵 : 27 , 安琦 : 19 , 叶子 : 20 ]
any:
判断集合中有木有年龄等于18岁的,此时用any就非常方便,如下:


看一下它的定义:

count:统计函数
查找一个年龄小于25岁的妹子的个数,如下:

find:查找第一个符合条件的并返回第一个
查找第一个是广东的妹子并打印出来,做法如下:

groupby:分组
按不同的地区对妹子集合进行分组,如下:

{山东=[Girl(name=依儿, age=18, height=168, address=山东), Girl(name=一生有你, age=22, height=163, address=山东), Girl(name=花儿, age=21, height=183, address=山东), Girl(name=猪猪侠, age=18, height=173, address=山东)], 河南=[Girl(name=笑笑, age=19, height=175, address=河南), Girl(name=喵喵, age=27, height=164, address=河南)], 福建=[Girl(name=小百合, age=17, height=155, address=福建)], 广东=[Girl(name=michel, age=22, height=148, address=广东), Girl(name=玲儿, age=23, height=169, address=广东), Girl(name=乔乔, age=35, height=180, address=广东), Girl(name=小可爱, age=29, height=158, address=广东), Girl(name=叶子, age=20, height=160, address=广东)], 广西=[Girl(name=猫咪, age=28, height=159, address=广西), Girl(name=悦悦, age=19, height=160, address=广西)], 安微=[Girl(name=环环, age=25, height=172, address=安微)], 河北=[Girl(name=胖嘟嘟, age=32, height=180, address=河北), Girl(name=安琦, age=19, height=159, address=河北)], 江西=[Girl(name=小可爱, age=27, height=150, address=江西)], 黑龙江=[Girl(name=敏儿, age=28, height=155, address=黑龙江)], 吉林=[Girl(name=月儿, age=25, height=178, address=吉林)], 新疆=[Girl(name=S小糖, age=49, height=190, address=新疆), Girl(name=紫琪, age=49, height=149, address=新疆)], 甘肃=[Girl(name=糖心, age=26, height=165, address=甘肃)], 浙江=[Girl(name=棒棒糖, age=23, height=172, address=浙江)]}
接着打印出广东组的所有妹子,可以这样做:

因为有可能组里没有广东的,也就是数据源可能为null,所以要想让上面的错误解除,则需要加入它:

自定义dsl入门:
什么是dsl呢?领域专用语言(domain specific language / DSL),也就是可以用自然语言来执行程序,让没有任何编程背景的人也能参考到编程当中来,第五代自然编程语言也是未来编程发展一个趋势,所以kotlin未来可期,学习它需要以下两个基础,之前已经学习过了:
- 扩展函数
- 中缀表达式
还是以查找妹子为例,先定义一个扩展函数,如下:

调用一下:

下面继续用中缀表达式对其进一步封装,使其更加简单,如下:

此时的调用就可以变为以空格分隔,如下:

接着再来定义大于指令年龄的,如下:


这就是DSL领域专用语言,下面再来定义一个:


那有了DSL之后,可以将程序包装成一个0难度上手的接口,但是实际中怎么用,这个待未来挖掘。
kotlin高阶函数实战&DSL入门的更多相关文章
- Kotlin高阶函数实战
前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...
- Kotlin高阶函数与函数式编程详解
函数可变参数: 在上一次https://www.cnblogs.com/webor2006/p/11518425.html中学到了可变参考,关于可变参数有如下规则说明: “一个方法中,只允许一个参数为 ...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- Python入门篇-高阶函数
Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数 1>.First Class Object 函数在Python中是一等公民 函数也 ...
- Kotlin的高阶函数和常用高阶函数
Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的 ...
- 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件
实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...
- python入门16 递归函数 高阶函数
递归函数:函数内部调用自身.(要注意跳出条件,否则会死循环) 高阶函数:函数的参数包含函数 递归函数 #coding:utf-8 #/usr/bin/python """ ...
- 07.Javascript——入门高阶函数
高阶函数英文叫Higher-order function..JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数 ...
- kotlin之高阶函数
高阶函数是一种特殊的函数,它接受函数作为参数,或者返回一个函数 import java.awt.geom.Area fun main(arg: Array<String>) { val m ...
随机推荐
- vlc 控件属性和方法
VLC调研 VLC控件支持的参数和方法 VLC对象列表 Vlc Plugin Object的方法 l VersionInfo:成员, 返回版本信息的字符串 l vlc.ve ...
- CTF—攻防练习之HTTP—命令注入
主机:192.168.32.152 靶机:192.168.32.167 首先nmap,nikto -host,dirb 探测robots.txt目录下 在/nothing目录中,查看源码发现pass ...
- 通过URLOS安装Redis缓存为wordpress网站提速
快!快!快!我们都知道网站的加载速度直接影响用户体验.据研究发现,网站页面在3秒内加载完毕对用户而言是最佳的浏览体验.如果超过这个时间,用户跳出网站的几率会非常大.所以对于站长来说,提高速度是他们追求 ...
- 【Ansible】记一次技术博客害死人的经历——ansible模板变量注入探究
风和日丽,夏天的北京湿热并举,睁不开的眼睛里,横竖都看着是“吃人”. 带薪学习的日子不好过,要在几天内迅速掌握导师下发要求学习的技能,看着以前一起蹲IT坑的同事人来人往,用隔壁同性黄同学的话来说,就是 ...
- Windows下的开发辅助神器——Chocolate Package Manager
Windows下的开发辅助神器——Chocolate Package Manager:https://juejin.im/post/5c6cb3acf265da2dc4537235 Windows上的 ...
- .NET Core和.NET Standard 区别与联系
每一种托管实现(如Xamarin..NET Core或.NET Framework)都必须遵循.NET Standard实现BCL..NET STANDARD LIBRARY是.net 标准库,.NE ...
- 使用Themleaf 模板引擎手动生成html文件
1.为什么要写这一篇呢? 在做一个邮件发送功能的时候,需要发送html邮件,javaMail 发送html 的时候需要有已经生成的html正文,所以需要提前将要发送的内容生成,所以就需要模板引擎来动态 ...
- [转帖]浪潮信息最大供应商英特尔(Intel):2018 年采购额 145.76 亿元
浪潮信息最大供应商英特尔(Intel):2018 年采购额 145.76 亿元 https://t.cj.sina.com.cn/articles/view/3172142827/bd130eeb01 ...
- 【转贴】bat脚本基础教程
bat脚本基础教程 https://www.cnblogs.com/linyfeng/p/8072002.html 自己动手太少了. bat脚本就是DOS批处理脚本,就是将一系列DOS命令按照一定顺序 ...
- 自己总结的keepalived的配置流程以及注意事项
编写背景:上班时领导要求我们团队实现postgresql主备切换的高可用问题,我辅助keepalived的部分,从查资料到实施最后使用,最后编写了这个博客,水平有限,欢迎大家指正 ###postgre ...