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. css 透明(transparent)

    opacity :  .75;     //standard css3 style for transparency -moz-opacity : .75;        // transparenc ...

  2. 安卓手机开机开启指定Activity

    1.布局 默认helloworld布局 2.class BootCompleteReceiver package lpc.com.project522; import android.content. ...

  3. 《机器学习实战》学习笔记——第14章 利用SVD简化数据

    一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...

  4. Cadence16.6安装破解

    1.软件安装 1.运行stepup.exe.出现下面界面后开始安装License manager和project installation. 注意:只安装第一项License manager和第二项p ...

  5. ASP.NET ZERO Core Application 学习笔记

    地址:https://www.aspnetzero.com/Documents/Development-Guide-Core 1.恢复数据库 MIGRATOR CONSOLE APPLICATION ...

  6. jsp学习--基本语法和基础知识

    一.JSP简单介绍 1.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于 ...

  7. shell脚本学习--shell中的变量$

    $$ :Shell本身的PID(ProcessID) $! :Shell最后运行的后台Process的PID $? :最后运行的命令的结束代码(返回值) $- :使用Set命令设定的Flag一览 $* ...

  8. Ubuntu遇到Please ensure that adb is correctly located at '...adb.exe' and can be executed 问题解决方法

    上次我们在SDK更新的到最新的Android L版本之后,我发现我的ADT和android指定的版本不对应,我的ADT是22版本的,android L需要23版本以上的,版本不对应的话就无法加载这个S ...

  9. RRDTool 三个命令的使用

    要了解rrdtool如何使用就要先从rrd的数据存储方式开始,rrdtool就是为了操作这个数据库的工具,抄来下面一段文字解释. 0x01 什么是rrd数据库 所谓的“Round Robin” 其实是 ...

  10. POJ 2983 Is the Information Reliable? 差分约束

    裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #i ...