给定一个字符串元素列表,如下所示:
里面有数字型字符串,有字母型字符串;字符串里有大写,也有小写;字符串长度也有长有短
现在要写代码完成 一个小功能 :
我想找出所有 长度>=5 的字符串,并且 忽略大小写 、 去除重复字符串 ,然后 按字母排序 ,最后 用“爱心❤”连接成一个字符串 输出!
哟,就这点需求能难倒我?三分钟之类必搞定!
首先我写一个函数,判断输入字符串到底是字母还是数字
接下来我一顿SAO操作:
最后输出结果为:
啪啪啪,打脸
我原以为这个功能我只需要3分钟即可写完并运行出结果,而实际对时我发现我居然花了5分钟。。。
而且我现在是一看到 for循环 遍历,我头就痛,上面代码倒还好,假如列表层级变复杂, 俄罗斯套娃式的for循环 谁扛得住。
没错,自Java 8开始,引入了函数式编程范式,这对于咱这种 底层劳动密集型码畜 来说,简直解放了双手,代码几乎少写一半,从此真正实现 编码5分钟,划水2小时 !
针对上面的作业,用Java 8的 Stream
流式操作,仅需 一行代码 就可以搞定,for循环啥的统统灰飞烟灭。
怎么样,这代码信噪比可以吧
上面其实已经通过举栗的方式阐述了Java 8函数式编程范式: Stream流 的优雅和强大,尤其在处理集合时,几本一步到位,嘎嘣脆。
当然 Stream 也仅仅只是Java 8函数式编程接口的一个而已,除了Stream接口,还有其他非常强大的函数式编程接口,比如:
Consumer
接口
Optional
接口
Function
接口
每个接口我们都来举一个好理解的例子,看完保证你难以拒绝!
顾名思义,它是“消费者的含义”,接受参数而不返回值,举个最最常见的栗子:
平时我们打印字符串,本质也是接受一个参数并打印出来,我们一般想都不想,会这样写:
一旦你用了 Consumer
之后,总感觉更加优雅一些
而且 Consumer
还可以用联用,达到多重处理的效果,比如:
当然本例只是打印字符串,比较简单,若业务更加复杂, Consumer
复用带来的便利性还是不小的。
Function
接口代表的含义是“函数”,其实和上面的 Consumer
有点像,不过 Function
既有输入,也有输出,使用更加灵活,举例:
比如我想对一个整数先乘以 2
,再计算平方值
别的不说,这个炫技操作还是可以的!
Optional
本质是个容器,你可以将你的变量交由它进行封装,这样我们就不用显式对原变量进行 null
值检测,防止出现各种空指针异常。举例:
我们想写一个获取学生某个课程考试分数的函数: getScore()
这样写倒不是不可以,但我们作为一个 “严谨且良心的” 后端工程师,这么多嵌套的 if 判空多少有点扎眼!
为此我们必须引入 Optional
:
漂亮!嵌套的if/else判空灰飞烟灭!
好啦,本文就抛砖引玉到这里了,大家可以在自己的代码中用函数式编程范式尝试做 小规模重构 ,相信用起来还是非常甜蜜的。
立个Flag,以后写代码,估计我会很少使用for循环了(滑稽),Stream流用起来简直不要太爽啊。。。
开个玩笑,函数式编程范式虽然用起来很爽,但也最好根据 实际业务情况 来决定是否使用,毕竟大面积的动态范式代码还是挺难看懂和维护的,总之就一句话, 理性使用,不要滥用 。
2020.01.01晚
给个[ 在看 ],是对程序羊最大的支持