java vuser 参数化_[Java8] 新特性系列一:行为参数化

1. 什么是行为参数化

行为参数化主要是为了应对需求的变化,减少代码的变动冗余、变动,应对行为标准建模,方式可以为定义接口,下面以一个例子说明行为参数化的必要性

2. 需求一

有一个Apple类,属性包括颜色、重量等,现在用户需求为:筛选出苹果重量>100的苹果,这个需求很简单,很容易想到的实现如下:

package lambdasinaction.chap1;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

/**

* @Author oxygen

* @Date 2020/7/20 0020

* @Version V1.0

**/

public class MyFilterApple {

public static void main(String[] args) {

List inventory = Arrays.asList(new Apple(100, "red"), new Apple(180, "green"));

List apple = findWeightGH100Apple(inventory);

}

private static List findWeightGH100Apple(List inventory) {

List result = new ArrayList<>();

for (Apple apple : inventory) {

if (apple.getWeight() > 100) {

result.add(apple);

}

}

return result;

}

public static class Apple {

private int weight = 0;

private String color = "";

public Apple(int weight, String color) {

this.weight = weight;

this.color = color;

}

public void setMethod&getMethod(...)

}

}

3. 需求二

用户改变增加需求:

筛选出重量>100而且颜色为red的苹果,很容易想到的实现为增加一个实现方法,但是随着需求的增加,会增加N多筛选的方法,同时冗余代码

private static List findWeightGH100Apple(List inventory) {

List result = new ArrayList<>();

for (Apple apple : inventory) {

if (apple.getWeight()>100 && "green".equals(apple.getColor())){

result.add(apple);

}

}

}

4. 改进一

4.1 定义接口传递行为

public interface ApplePredicate {

boolean test(Apple apple);

}

4.2 多个类实现具体的逻辑

/**

*过滤重量大于100而且颜色是红色的苹果

*/

public class AppleColorPredicate implements ApplePredicate {

@Override

public boolean test(Apple apple) {

return "red".equals(apple.getColor()) && apple.getWeight() > 100;

}

}

/**

* 过滤重量>150的苹果

*/

public class AppleHeavyWeightPredicate implements ApplePredicate {

@Override

public boolean test(Apple apple) {

return apple.getWeight() > 150;

}

}

4.3 定义实现方法

List inventory = Arrays.asList(new Apple(100, "red"), new Apple(180, "green"));

MyFilterApple.AppleColorPredicate p = new MyFilterApple().new AppleColorPredicate();

List apples = filterApples(inventory, p);

MyFilterApple.AppleHeavyWeightPredicate p2 = new MyFilterApple().new AppleHeavyWeightPredicate();

List apples1 = filterApples(inventory, p2);

private static List filterApples(List inventory, ApplePredicate p) {

List result = new ArrayList<>();

for (Apple apple : inventory) {

if (p.test(apple)) {

result.add(apple);

}

}

return result;

}

5. 改进二

filterApples方法只能接受对象,所以必须把代码包裹在ApplePredicate对象里,因为通过一个实现了test方法的对象来传递布尔表达式

可用匿名内部类和Lambd改进

List apples3 = filterApples(inventory, new ApplePredicate() {//匿名内部类优化

@Override

public boolean test(Apple apple) {

return apple.getWeight() > 150;

}

});

List apples3 = filterApples(inventory, apple -> apple.getWeight() > 100);//Lambda表达式优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值