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. 【转】还html标签以本来意义

    说句实话,“div+css”这个词汇不知道害了多少人,也许其提出者本意并没有错,但是跟风者从表现曲解了其意思,认为整个页面就应当是div+css文件的组合.这样做,对于视觉上并没有什么影响,因为还原了 ...

  2. JQuery 动画及一些小知识点

    JQuery  动画 show(),hide()显示/隐藏slideDown(),slideUp() 拉开/合起fadeIn(),fadeOut()渐出/渐入自定义动画 animate({left:& ...

  3. collectionView使用细节

    1.//创建组头组尾一个方法 - (UICollectionReusableView *)stCollectionView:(UICollectionView *)collectionView vie ...

  4. AS错误:Please configure your build for VectorDrawableCompat.

    运行第一个Android Stdio程序就出现下面这个问题,由于对Android Stdio不熟悉整了三个小时才解决,希望这篇博客能帮助更多的人. 问题:Caused by:java.lang.Run ...

  5. [题解]hdu 1009 FatMouse' Trade(贪心基础题)

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  6. Android Studio 引入 Fresco

    首选在build.gradle文件中配置 查看NDK路径 然后在gradle.properties文件中配置 ndk.path=C\:\\Users\\lixishuang\\AppData\\Loc ...

  7. 命令行参数 main()函数设计

    一.main()函数的形式 int main( void )--无参数形式 { ... return 0; } int main( int argc, char *argv[] )--带参数形式 { ...

  8. FreeBSD_11-系统管理——{Part_6 - SYSCTL}

    sysctl 常见参数 Name Type Changeable 示例 & 示意 kern.ostype string no FreeBSD kern.osrelease string no ...

  9. (Python)list的内建函数 filter(), map(), 和 reduce()

    这一节,我们将主要学习用于list的三个内建函数: filter(), map(), 和 reduce(). 1.filter(function, sequence)  逐个从sequence中取一个 ...

  10. Windows通用应用开发手记-Behavior SDK概述

    随着Visual Studio 2013的发布,New Behavior SDK也一起出现了.和Expression Blend SDK相似,包括各种内置行为(behavior和action),可以用 ...