引言:
最近回看了一遍<java8函数式编程><java8实战>等书,加上平时自己function编程写的很多,写一点感悟
"软件开发最重要的设计工具不是什么技术,而是一颗在设计原则方面训练有素的头脑" -Craig Larman
Lambda改变了设计模式
设计模式理论上是一种通用问题的解决方案模版,但是随着编程范式的进步,设计模式的写法也变得多样。诚然,设计模式没有最优实践,以前解决问题的方式可能会在新的场景下成为“反模式”,所以我们这次讨论的是如何用Lambda表达式让现有的设计模式变的更简单,带来一些新的思路。
Lambda改变了编程范式
在stream流之前,java过滤和排序是挺麻烦的操作,在对一个集合操作的时候,会需要写Comparator实现类,或者写一些复杂的过滤类。而且都是比较单一的,如果你想组合使用,还需要再拓展。
在新的编程范式下,我们可以用functional来实现优雅的集合操作~
在可读性上提高是非常有效果的,因为predicate、consumer、comparator等函数式接口组合起来,就可以用一个method表明组合之后的功能,然后丢进一个stream流中,从上读到下,便清楚了整个stream流做了什么。
并且functional组合是可以支持 and or等多条件的
如:
案例我写的比较随意,在真实的项目中,一定是对任何一个方法名或者方法的复杂度都比较“洁癖”,写到很优雅为止。
这里想表达就是,你可以用functional组合的方式,非常优雅清楚的表达意图,并且拓展性强。
在上述的例子里,我只需要把获取predicate、comparator的行为抽离一个factory出来,便可以将所有过滤、排序操作,维护在factory中,那么这个类中的代码便非常优雅。
细节要到位点,比如工具类要用final和私有构造等。当然,如果你的排序、过滤比较复杂,需要引入其他依赖判断,那你可以把这个factory交给Spring管理,然后把静态方法改成autowared之后直接调,这里只提供思路。
然后我们来看看lambda在设计模式中的一些尝试
Lambda设计模式案例
1.工厂模式
直接看代码吧,其实就是秀一下Supplier这个functional interface,毕竟官方给的说法就是适合理解为容器。
容器不就是享元设计模式嘛,大概意思就是维护一个map,你要的时候去那里拿,和享元模式的区别就是,这里不是单例,享元还是节省对象创建,这里属于工厂,每一次new出来的都是新的对象,这里更多的是说map吐给你的是一个Supplier函数,你再apply一下才是你需要的实例。
然后还有一点就是,effective java、google guava等推荐的创建对象或集合范式都是静态方法,方法签名表示含义,并且可以避免构造函数参数太多搞不清楚,所以你可以看到集合也是Maps.newHashMapWithxxx这种。所以顺带提一下这种creative风格 object building。
whats more :
个人感觉这种思维吧,再拓展的话,可以往函数式编程想法靠,就是暴露一些Supplier这种函数做方法参数签名,让你去丢一些lambda进来。
2.责任链
也没什么好说的,看代码,就是个function组合。
这里带了一下builder模式,就是静态内部类取代了new出来set get,自行研究
还是那句话,重点在优雅,语义强。
3.策略模式
看代码吧
搞py的要吐槽了,我玩了多少年的函数式编程。
whats more
这种玩法现在在各大框架超级常见了,留一些functional interface让你传参,还有一些是做成spi让你实现。
总结
我没有再继续列举各种玩法,因为核心思想还是oop、dp那套,像组合思想、单一原则等。
掌握这个思路,可以有各种脑洞,核心思想就是要炫酷,要优雅,要告别又臭又长的循环、组合创建。
随着Spring 5 Reactive、Google等新推的范式,估计以后代码会越来越骚,像现在很多设计,都会在入参和出参上选择一些函数式、响应式、异步式类型了。
就比如cache返回CompleableFuture、ListenableFuture等。
reactive返回Flux、Mono等。
最后源码地址:












网友评论