public class CartViewRender {
public static CartView renderMyCartView(Cart cart){
ErrorCodeEnum errorCode = null;
try {
cart.source = CartSource.My_Cart;
CartFlowProccess.proccessMyCart(cart);
} catch (TradeBaseException e) {
errorCode = e.getErrorCodeEnum();
} catch(Exception e){
errorCode = ErrorCodeEnum.Cart_Error_System;
}
return RenderViewHelper.renderMyCartView(cart, errorCode);
} public static CartView renderMobileMyCartView(Cart cart){
ErrorCodeEnum errorCode = null;
try {
CartFlowProccess.proccessMyCart(cart);
} catch (TradeBaseException e) {
errorCode = e.getErrorCodeEnum();
} catch(Exception e){
errorCode = ErrorCodeEnum.Cart_Error_System;
}
return RenderViewHelper.renderMyCartView(cart, errorCode);
} public static CartView renderAddCartView(Cart cart){
ErrorCodeEnum errorCode = null;
try {
cart.source = CartSource.Add_Cart;
CartFlowProccess.proccessAddCart(cart);
} catch (TradeBaseException e) {
errorCode = e.getErrorCodeEnum();
} catch(Exception e){
errorCode = ErrorCodeEnum.Cart_Error_System;
}
return RenderViewHelper.renderAddCartView(cart, errorCode);
} //... }

这是一段典型的重复代码示例,前两个方法基本上是完全重复的,最后一个方法则是非常的类似。先把前两个方法改了,这个非常简单。

  public static CartView renderMyCartViewFromNoSource(Cart cart)
{
ErrorCodeEnum errorCode = null;
try {
CartFlowProccess.proccessMyCart(cart);
} catch (TradeBaseException e) {
errorCode = e.getErrorCodeEnum();
} catch(Exception e){
errorCode = ErrorCodeEnum.Cart_Error_System;
}
return RenderViewHelper.renderMyCartView(cart, errorCode); }
public static CartView renderMyCartView(Cart cart){
cart.source = CartSource.My_Cart;
return renderMyCartViewFromNoSource(cart);
} public static CartView renderMobileMyCartView(Cart cart){
return renderMyCartViewFromNoSource(cart);
}

比较麻烦的是最后一个方法如何消除重复,在.net的世界中有delegate和lambda表达式,这个问题会比较容易搞定,而java只能用匿名类了。

首先观察第三个方法与前两个方法的不同之处。其实只有两行代码不同,那么我们只要想办法将它们抽取出来就可以了。

先声明两个泛型接口,用于表示两个变化点:

interface Action<T>
{
void act(T t);
} interface Func<T1,T2,T3>
{
T3 execute(T1 t1,T2 t2);
}

然后使用这两个接口创建一个通用方法。

 public static CartView renderCartView(Cart cart, Action<Cart> action, Func<Cart, ErrorCodeEnum, CartView> func)
{
ErrorCodeEnum errorCode = null;
Action<Cart> cartAction = null; try
{
action.act(cart);
} catch (TradeBaseException e)
{
errorCode = e.getErrorCodeEnum();
} catch (Exception e)
{
errorCode = ErrorCodeEnum.Cart_Error_System;
}
return func.execute(cart, errorCode);
}

最后改写最后一个方法的实现,由于没有lambda表达式,代码看上去比较复杂些。

 public static CartView renderAddCartView(Cart cart)
{
cart.source=CartSource.Add_Cart; return renderCartView(cart, new Action<Cart>()
{
@Override
public void act(Cart cart)
{
CartFlowProccess.proccessAddCart(cart);
}
}, new Func<Cart, ErrorCodeEnum, CartView>()
{
@Override
public CartView execute(Cart cart, ErrorCodeEnum errorCode)
{
return RenderViewHelper.renderAddCartView(cart, errorCode);
}
}
);
}

如果你用了Intellj IDE,它会帮你自动做一些代码格式化。Java8之后就能支持的更好了。

最后完整代码如下:

public class CartViewRender
{ public static CartView renderCartView(Cart cart, Action<Cart> action, Func<Cart, ErrorCodeEnum, CartView> func)
{
ErrorCodeEnum errorCode = null;
Action<Cart> cartAction = null; try
{
action.act(cart);
} catch (TradeBaseException e)
{
errorCode = e.getErrorCodeEnum();
} catch (Exception e)
{
errorCode = ErrorCodeEnum.Cart_Error_System;
}
return func.execute(cart, errorCode);
} public static CartView renderMyCartViewFromNoSource(Cart cart)
{
return renderCartView(cart, new Action<Cart>()
{
@Override
public void act(Cart cart)
{
CartFlowProccess.proccessMyCart(cart);
}
}, new Func<Cart, ErrorCodeEnum, CartView>()
{
@Override
public CartView execute(Cart cart, ErrorCodeEnum errorCode)
{
return RenderViewHelper.renderMyCartView(cart, errorCode);
}
}
);
} public static CartView renderMyCartView(Cart cart)
{
cart.source = CartSource.My_Cart;
return renderMyCartViewFromNoSource(cart);
} public static CartView renderMobileMyCartView(Cart cart)
{
return renderMyCartViewFromNoSource(cart);
} public static CartView renderAddCartView(Cart cart)
{
cart.source=CartSource.Add_Cart; return renderCartView(cart, new Action<Cart>()
{
@Override
public void act(Cart cart)
{
CartFlowProccess.proccessAddCart(cart);
}
}, new Func<Cart, ErrorCodeEnum, CartView>()
{
@Override
public CartView execute(Cart cart, ErrorCodeEnum errorCode)
{
return RenderViewHelper.renderAddCartView(cart, errorCode);
}
}
);
} //... }

每日代码 - 6/26 lambda表达式的更多相关文章

  1. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  2. Java 8特性探究(1):通往lambda之路与 lambda表达式10个示例

    本文由 ImportNew 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的ja ...

  3. Java8 Lambda表达式原理扫盲

    背景 在使用Lamdba表达式,一直以为是内部类的方式实现的,但是一想如果每次调用都实例化一个内部类,性能肯定不好,难道Java里的lambda表达式真的是这么实现的吗?也许是该研究下原理了. 正文 ...

  4. jdk8 lambda表达式总结

    Java8 lambda表达式10个示例   1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnab ...

  5. Java 8 lambda表达式示例

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  6. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

  7. Java8 lambda表达式10个示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  8. java8-02-再探Lambda表达式

    Lambda表达式   主要作用替代匿名内部类   达到简化代码的操作                                  Lambda表达式 在对象中的使用   Employee类

  9. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

随机推荐

  1. java与微信企业号交互

    微信企业号接收消息(使用SpringMVC): http://blog.csdn.net/omsvip/article/details/39480577 微信企业号api: http://qydev. ...

  2. scala学习:apply方法

    摘抄两段话: 在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号.如 " to ",实际完整调用是 ".to()".但 &qu ...

  3. error in opening zip file 1 错误

    项目部署服务启动时会出现: error in opening zip file 1 错误 原来是不同服务器编译过的jar包直接下载后发布有问题,重新上传本地编译好的lib下面的jar包后,启动服务,正 ...

  4. Linux系统编程-防止僵尸进程产生的常用方法

    1.父进程调用wait函数或waitpid函数回收子进程. 2.让init进程去处理子进程回收工作,代码中加上"signal(SIGCHLD, SIG_IGN)"这句话.

  5. HTML、CSS小知识--兼容IE的下拉选择框select

    HTML <div class="s_h_ie"> <select id="Select1" disabled="disabled& ...

  6. UISearchBar

    UISearchBar——方便用户搜索信息 在移动应用程序的世界里,用户对信息获取的速度要求非常高!iOS用户希望他们需要的信息能够迅速地,直观地展现在他们面前 因为UITableView的上下滚动能 ...

  7. 解决winrar压缩软件弹出广告

    最近winrar每次打开压缩包就会弹出一个广告,那是因为winrar是收费软件,注册了就没有广告了.下面我教大家怎么注册来屏蔽广告. 解决方法 1.新建一个txt文件并命名为"rarreg. ...

  8. PostGreSQL 分页

    select * from users limit 10 offset 20; limit A offset B    其中A是页容量 B是偏移量 即跳过前20条 查询每页10条

  9. sublime txt 设置在浏览器预览

    1. 安装SideBarEnhancements插件 ctrl+shift+p —> Install Package —> 找到SideBarEnhancements 2. 配置预览快捷键 ...

  10. python 内置函数 map filter reduce lambda

    map(函数名,可遍历迭代的对象) # 列组元素全加 10 # map(需要做什么的函数,遍历迭代对象)函数 map()遍历序列得到一个列表,列表的序号和个数和原来一样 l = [2,3,4,5,6, ...