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. JQuery this 和 $(this) 详解

    this  this 在面向对象语言中,指代调用上下文对象,在js中,也是一模一样的概念,所以不管这个this出现在什么地方,只要追踪到当前调用对象是什么,那么this是什么也就一目了然了. 先看一个 ...

  2. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. spilt()的用法

    split() 方法用于把一个字符串分割成字符串数组.<script type="text/javascript"> var str="How are you ...

  4. Java 基础知识总结 (四、String)

    四.String public final class String extends Object implements Serializable, Comparable<String>, ...

  5. AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5

    前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step- #切换分支 npm start ...

  6. AFNetwork 作用和用法详解

    转自:http://www.cnblogs.com/mkai/p/5729685.html AFNetworking是一个轻量级的iOS网络通信类库.它建立在NSURLConnection和NSOpe ...

  7. 内存,堆,栈,heap,stack,data

    1. 基本类型占一块内存. 引用类型占两块. 2. 类是静态概念. 函数中定义的基本类型变量和对象的引用类型变量都在函数的栈内存. 局部变量存在栈内存. new创建的对象和数组,存在堆内存. java ...

  8. try-catch-finally的含有return使用揭秘

    很多人都会纠结这么一个问题try-catch-finally中有return的情况,我自己总结如下: 如果是值类型的话 请看代码 using System; using System.Collecti ...

  9. js之文档对象的设置(DOM)

    1.对象文本: 对象.innerHTML;   对象.innerHTML=""; 对象.innerText; 对象.innerText=""; 2.对象属性: ...

  10. 修改Broforce无限人数,死亡不减反加

    看B站直播发现这个有趣的游戏,找了半天修改器无效,Cheat Engine怎么找指针有点忘了,直接找数值每关都要重来,想来想去还是简单粗暴的反编译好了. 顺便做下C#反编译备忘. 首先把DLL反成IL ...