首页 > 其他分享 >通过map+Function优化if else

通过map+Function优化if else

时间:2023-05-05 14:13:29浏览次数:36  
标签:Function map return String else public OrderStatus put Order

需求背景

在实际项目中,好比在一个简单的订单处理系统,其中订单有不同的状态(比如新建、已支付、已发货、已收货等),为了实现基于状态机的逻辑处理,我们可以通过switch(状态)去对应不同状态的处理逻辑。

 1  public String process2() {
 2         switch (status) {
 3             case NEW:
 4                 return handleNewOrder();
 5             case PAYMENT_RECEIVED:
 6                 return handlePayment();
 7             case SHIPPED:
 8                 return handleShipment();
 9             case DELIVERED:
10                 return handleDelivered();
11             default:
12                 return "Invalid order";
13         }
14     }

但有种更优雅的做法是通过ImmutableMap<Integer, Function<Object, String>> 的方式去实现。

 1 public static final ImmutableMap<OrderStatus , Function<Order, String>> STATUS_HANDLERS =
 2             ImmutableMap.<OrderStatus, Function<Order, String>>builder()
 3                     .put(OrderStatus.NEW, Order::handleNewOrder)
 4                     .put(OrderStatus.PAYMENT_RECEIVED, Order::handlePayment)
 5                     .put(OrderStatus.SHIPPED, Order::handleShipment)
 6                     .put(OrderStatus.DELIVERED, Order::handleDelivered)
 7                     .build();
 8 
 9     public String process() {
10         Function<Order, String> handler = STATUS_HANDLERS.get(status);
11         if (handler == null) {
12             return "Invalid order";
13         }
14         return handler.apply(this);
15     }

完整代码如下

订单状态枚举

 1 public enum OrderStatus {
 2     /**
 3      * 新建
 4      * 已付款
 5      * 已发货
 6      * 已收货
 7      */
 8     NEW,
 9     PAYMENT_RECEIVED,
10     SHIPPED,
11     DELIVERED
12 }

订单类

 1 @Data
 2 public class Order {
 3     private final String orderId;
 4     private final OrderStatus status;
 5 
 6     public Order(String orderId, OrderStatus status) {
 7         this.orderId = orderId;
 8         this.status = status;
 9     }
10 
11     public static final ImmutableMap<OrderStatus , Function<Order, String>> STATUS_HANDLERS =
12             ImmutableMap.<OrderStatus, Function<Order, String>>builder()
13                     .put(OrderStatus.NEW, Order::handleNewOrder)
14                     .put(OrderStatus.PAYMENT_RECEIVED, Order::handlePayment)
15                     .put(OrderStatus.SHIPPED, Order::handleShipment)
16                     .put(OrderStatus.DELIVERED, Order::handleDelivered)
17                     .build();
18 
19     public String process() {
20         Function<Order, String> handler = STATUS_HANDLERS.get(status);
21         if (handler == null) {
22             return "Invalid order";
23         }
24         return handler.apply(this);
25     }
26 
27     public String process2() {
28         switch (status) {
29             case NEW:
30                 return handleNewOrder();
31             case PAYMENT_RECEIVED:
32                 return handlePayment();
33             case SHIPPED:
34                 return handleShipment();
35             case DELIVERED:
36                 return handleDelivered();
37             default:
38                 return "Invalid order";
39         }
40     }
41 
42     private String handleNewOrder() {
43         // Handle new order logic here
44         return "Order " + orderId + " 新建";
45     }
46 
47     private String handlePayment() {
48         // Handle payment logic here
49         return "Order " + orderId + " 已支付";
50     }
51 
52     private String handleShipment() {
53         // Handle shipment logic here
54         return "Order " + orderId + " 已发货";
55     }
56 
57     private String handleDelivered() {
58         // Handle delivered logic here
59         return "Order " + orderId + " 已收获";
60     }
61 
62     public static void main(String[] args) {
63         Order order = new Order("12345", OrderStatus.SHIPPED);
64         //if else方式
65         String result2 = order.process2();
66         //map + Function的方式
67         String result = order.process();
68 
69         System.out.println(result);
70         System.out.println(result2);
71     }
72 }

运行结果

 

标签:Function,map,return,String,else,public,OrderStatus,put,Order
From: https://www.cnblogs.com/liaowenhui/p/17373943.html

相关文章

  • AWS Serverless Lambda Function架构设计的几种方式
    如何构建大型Serverless应用从路由方式上,Lambda大致可以分为三种架构方式1:单体应用式这种方式和传统RESTAPI很相似,以nodejs为例,在service内部使用express框架作路由,如下图所示代码示例如下constexpress=require('express')constapp=express()app.listen(80,()=>......
  • SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策
    场景设计模式-策略模式在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127622238上面讲了策略模式在Java中的使用示例。下面看一个在SpringBoot中的实际使用示例。业务场景:有多个煤矿,信号灯有多个厂家/规则,每个煤矿对应一种信号灯。需要编......
  • DevTools failed to load source map: Could not load content for https://xxxxx/boo
    DevToolsfailedtoloadsourcemap:Couldnotloadcontentforhttps://xxxxx/bootstrap-theme.css.map:HTTPerror:statuscode404,net::ERR_HTTP_RESPONSE_CODE_FAILURE这个错误意味着浏览器无法加载指定的CSSsourcemap文件。CSSsourcemap文件通常用于调试前端......
  • 5月4日:unordermap/set,哈希以及哈希常用的拉链法,开放地址法,以及模板的特化相关应用
    起处较为流行的数据储存方式为树形结构,再加上红黑树等优秀数据结构的发展,直到今天二叉平衡搜索树也经常被应用在各种方面,但是c++库里面还有两个与map/set很像的容器unorderedmap,他们的调用与普通的map几乎一样,有着非常优秀的查找时间复杂度,只是不能像二叉树哪样层序遍历得到顺序的......
  • global mapper显示shp属性标注
    globalmapperprov24.0版本,打开shp文件,点中需标注的shp文件,右键——图层——创建标签图层:标签-设置要素标签显示-使用所选属性值-“在包含当前shp所有属性字段下拉列表里选择需要显示的属性字段”或者(菜单栏——图层——创建标签图层)。 ####################global......
  • 简单聊聊,HashMap、HashTable、ConcurrentHashMap 之间的区别
    一、直观上的区别HashTable和HashMap都是用于存储键值对的数据结构我们一般把搜索的数据称之为关键字(key),与关键字key对应的为值(value),这种模型统称为“key-value的键值对”。Map和Table采用的都是key-Value模型,例如:有一个字符串,统计其中每个字符出现的次数,......
  • python 内置函数map()、filter()函数
    map()函数接受两个参数:第一个参数是一个函数,第二个参数是一个可迭代对象(如列表、元组等)。该函数会将可迭代对象中的每个元素依次传递给第一个参数指定的函数,并返回一个新的可迭代对象,其中每个元素都是原始对象经过该函数转换后的结果。具体来说,map()函数会将可迭代对象中的每个......
  • C++ STL map 【避坑】 中括号查找(map[.])导致超时
    感谢大神的博客:STLmap关于查找的坑——尽量不使用方括号[]查找_stlmap查找_sdudyl的博客-CSDN博客今天在CF补了一道题,我开了map使用中括号查找,结果第二组就T了。我百思不得其解,最后把map[x]换成map.count(x)就过了。因为这样使用中括号查找x时,如果找不到x,会向容器中插入一......
  • Built-in Functions
    以为内置函数有很多呢 https://docs.python.org/3/library/functions.html ......
  • 恶意软件如何隐藏DLL以及如何识别它?——可以使用vmmmap、procexp、volatility 3
       好了,为了简单表示上述提到的PEB和DLL加载的关系,给一一张图如下:TEB(ThreadEnvironmentBlock,线程环境块)系统在此TEB中保存频繁使用的线程相关的数据。PEB(ProcessEnvironmentBlock,进程环境块)存放进程信息,每个进程都有自己的PEB信息。  上图可以看到dll清单类似o......