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. gdb调式

    1.PCB版的相应目录下执行命令: gdbserver 10.18.13.84:5555 DvdPlayer 2.linux操作系统执行:(如果是android找到android项目路径下的gdb)m ...

  2. PHP安装rrdtool扩展

    首先,我的环境是Centos 6.5 PHP版本是5.51.首先安装rrdtool需要的依赖库文件   yum -y install pango* 2.先服务器安装rrdtool  wget http ...

  3. springMVC框架中,在hib-config.xml配置sqlserver2008数据库连接的代码

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">     ...

  4. [转] Eclipse 编辑相关快捷键

    Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户编辑的好帮手,能为用户提供内 ...

  5. Spring学习笔记 Part.01

    Hibernate的作用: 1.可以解决以面向对象的方式操作数据库的问题 请求参数(String)→Strut2→Action(对象)→业务逻辑组件(面向对象) 2.所以任何一个ORM框架都可以代替H ...

  6. css3之background-clip与background-origin的区别

    background-clip 规定背景的绘制区域. 3 background-origin 规定背景图片的定位区域. 3 background-size 规定背景图片的尺寸. 3 backgroun ...

  7. 【JSP】Tiles框架的基本使用

    Tiles介绍 Tiles 是一种JSP布局框架,主要目的是为了将复杂的jsp页面作为一个的页面的部分机能,然后用来组合成一个最终表示用页面用的,这样的话,便于对页面的各个机能的变更及维护. Tile ...

  8. 不要轻易delete void*指针,这样会隐藏比较多的错误。

    #include<iostream> using namespace std; class Object{ void* data; const int size; const char i ...

  9. 检查css没被引用上的问题

    1.外部链接是否对的. 2.设置的命名是否一致或同名设置了 3.删除添加的注释看看

  10. SWAP空间不足,如何进行添加

    交换分区值过小,可以有两种方法来增加swap分区,一种是将新的分区来作为swap,另一种是在磁盘中创建一个大的文件来作swap. 我们以文件扩展swap [root@xuegod63 ~]# cd / ...