请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于函数式接口的理解

老师您好,还是不太能理解函数式接口,主要是不知道它在实际场景中的作用,比如

Predicate

这个函数式接口,我在代码里面写if else不也是一样吗?

Predicate<String> pre = (String username) ->
{
    return "admin".equals(username);
};
System.out.println(pre.test("adminn"));//false

感觉就是省了个方法。


好像在工作中真的很难想到使用函数式接口,老师您能举个实际的例子让我见证一下函数式接口的威力吗?

正在回答

4回答

细细品味这句话:函数式接口就是将业务逻辑参数化。

真正理解了这句话,就理解函数式接口存在的意义了。

还有就是建议手敲一遍代码,可以先自己尝试设计一下接口,看看有什么缺陷,容不容易扩展。体会一下这种演变方式的好处。

有什么问题,随时留言哈。

0 回复 有任何疑惑可以回复我~
  • 提问者 乃好 #1
    谢谢老师!确实要好好琢磨一下
    回复 有任何疑惑可以回复我~ 2020-04-02 00:39:27
张小喜 2020-04-01 23:57:35

看我这样设计好不好:

https://img1.sycdn.imooc.com/szimg/5e84b8ca09a4574410390565.jpg

这个方法里面包含了所有平台的判断逻辑,根据不同平台走不同的免邮判断逻辑。

以后会遇到的问题:

第一:如果引入第四家电商,就需要再写一个if判断,把第四家的免邮逻辑也要拿过来。

第二:如果哪天淘宝重新规定免邮逻辑了,需要通知顺丰来修改这个方法的逻辑。

1 回复 有任何疑惑可以回复我~
  • 提问者 乃好 #1
    嗯这样的设计下确实不能很好的满足开闭原则,总感觉能用上某种设计模式 但还是没能get到函数式接口的点
    回复 有任何疑惑可以回复我~ 2020-04-02 00:05:04
  • 张小喜 回复 提问者 乃好 #2
    不用纠结设计模式。Java搞出这么个函数式接口(其实JS里面早就有了,因为是面向函数的语言),背后肯定是有设计模式做支撑的。可以了解一下策略模式。只不过Java的设计模式是构建再类/对象的基础上的,所以显得很繁琐,不够简洁。
    回复 有任何疑惑可以回复我~ 2020-04-02 00:16:50
张小喜 2020-04-02 00:08:42

再来看这个设计:

https://img1.sycdn.imooc.com//szimg/5e84ba640981913312100816.jpg

方法中将每家判断是否免邮的逻辑使用一个Predicate函数式接口来代替,作为方法的参数传递进来。

https://img1.sycdn.imooc.com//szimg/5e84baff09c746e108270559.jpg

https://img1.sycdn.imooc.com/szimg/5e84bb2009d3df0c08300572.jpg

每家调用接口的时候,只需要将自家免邮的业务判断逻辑当作一个参数传入到邮费计算接口中就可以了。

这样做的好处是:

第一:邮费计算接口中只包含相对固定,通用的业务逻辑,将定制化强的业务逻辑作为一个参数,让调用方自己定义。

第二:以后扩展第四家也非常简单,因为接口是通用的。

第三:以后如果扩展接口的实现逻辑,比如:当判断免邮后,记录一条免邮信息。或者给用户发送免邮短信等。只需要稍作修改就行。

0 回复 有任何疑惑可以回复我~
张小喜 2020-04-01 23:40:15

想象一下:

如果我是顺丰,我来负责淘宝,京东和拼多多的商品配送服务。我需要设计一个根据订单信息计算邮费的接口,三个电商网站系统调用我这个接口给用户计算邮费。应该怎么设计?

需要考虑如下几个问题点:

第一:三个电商有自己不同的免邮费政策,比如:淘宝大于100件包邮,京东订单满99包邮,拼多多...如何才能在邮费计算的接口中根据不同电商平台,分别调用他们的免邮政策呢?

第二:顺丰有自己的邮费计算规则,比如:基础运费10元,超重增加10元,超体积增加10元...这部分逻辑应该是通用的,只要不免邮费,就要调用这段逻辑计算邮费。如何将个性化的逻辑和通用的逻辑整合到一个接口中呢?

第三:如何设计才能最容易扩展,为以后对接其他平台预留灵活性?

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信