登录 后使用快捷导航
没有帐号?立即注册

IT撸码课程网

用户名   找回密码
  立即注册
发新帖

放牛娃学Java-Java8系列-行为参数化

[复制链接]
100 204 100
发表于2018-12-23 11:46:53 | 只看楼主 | 阅读模式
下一主题
登录后查看本帖详细内容!您需要登录后才可以下载 登录 | 立即注册


放牛娃学Java-Java8系列-行为参数化


我们常常写一下重复的代码,啰嗦的代码,应对不断变化的需求只知道 复制+粘贴


需求:比如一个果农想查看绿色的苹果,后来又想查看重量在100克的苹果,后来又想查看A地区的苹果,后来又想查看甜度高的苹果,后来...........


package com.example.demo.java8.parameter;


import com.example.demo.model.Apple;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 行为参数化传递代码
 * @author huxu
 */
public class Demo1 {


    /**
     * 1、获取绿色的苹果
     * @param inventory
     * @return
     */
    public static List<Apple> filterGreenApples(List<Apple> inventory){
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (StringUtils.equals("green", apple.getColor())){
                result.add(apple);
            }
        }
        return result;
    }


    /**
     * 2、将颜色作为参数传入
     * @param inventory
     * @param color
     * @return
     */
    public static List<Apple> filterGreenApplesByColor(List<Apple> inventory, String color){
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (StringUtils.equals(color, apple.getColor())){
                result.add(apple);
            }
        }
        return result;
    }


    /**
     * 3、如果要改变重量怎么办, 难道又把重量作为参数传入进去?
     * @param inventory
     * @param weight
     * @return
     */
    public static List<Apple> filterApplerByWeight(List<Apple> inventory, int weight){
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > weight) {
                result.add(apple);
            }
        }
        return result;
    }



想改变多个怎么办,难道这样来玩

/**
 * 4、难道用这种SB的方法来搞定,如果想改变多个怎么办, 10, 100个?
 * @param inventory
 * @param color
 * @param weight
 * @param flag
 * @return
 */
public static List<Apple> fileterApples(List<Apple> inventory, String color, int weight, boolean flag){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory) {
        if ((apple.getWeight() > weight && flag) || (StringUtils.equals(color, apple.getColor()) && !flag)) {
            result.add(apple);
        }
    }
    return result;
}


接下来我们引入行为参数化, 用标准建模来更好的应对参数的变化

/**
 * 接下来我们引入行为参数化, 用标准建模来更好的应对参数的变化
 * 1、定义一个接口;
 * 2、需求变化实现该接口即可
 * 3、interface ApplePredicate{}
 * 4、AppleHeavyWeightPredicate implements ApplePredicate{}
 * 5、AppleGreenColorPredicate implements ApplePredicate{}
 */

public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate predicate){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory) {
        if (predicate.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}


3.png


package com.example.demo.java8.parameter;

import com.example.demo.model.Apple;

/**
 * 定义一个接口
 */
public interface ApplePredicate {


    boolean test(Apple apple);

}
package com.example.demo.java8.parameter;

import com.example.demo.model.Apple;
import org.apache.commons.lang3.StringUtils;

/**
 * 改变颜色的策略
 */
public class AppleGreenColorPredicate implements ApplePredicate{

    @Override
    public boolean test(Apple apple) {
        return StringUtils.equals("green", apple.getColor());
    }

}
package com.example.demo.java8.parameter;

import com.example.demo.model.Apple;

/**
 * 改变重量的策略
 */
public class AppleHeavyWeightPredicate implements ApplePredicate{

    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 50;
    }

}


这样就行为参数化了

package com.example.demo;

import com.example.demo.java8.parameter.AppleGreenColorPredicate;
import com.example.demo.java8.parameter.Demo1;
import com.example.demo.model.Apple;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Arrays;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {


    @Test
    public void demo1() {

        List<Apple> list = Arrays.asList(new Apple("1号", "green", 10),
                      new Apple("2号", "blue", 20),
                      new Apple("3号", "green", 60),
                      new Apple("4号", "green", 8),
                      new Apple("5号", "red", 80));
        List<Apple> apples = Demo1.filterApples(list, new AppleGreenColorPredicate());
        System.out.println(apples);


    }
    

}



但是我们还不满足,现在只能处理苹果apple的, 如何我要处理梨子pear、香蕉banana  等等怎么办

将 List 类型参数化, 想传什么就传什么

package com.example.demo.java8.parameter;

/**
 * list也抽象化的接口,想传什么水果就什么水果
 */
public interface Predicate<T> {

    boolean test(T t);

}
/**
 * 将List也抽象化了
 * @param list
 * @param p
 * @param <T>
 * @return
 */
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
    List<T> result = new ArrayList<>();
    for (T e : list) {
        if (p.test(e)){
            result.add(e);
        }
    }
    return result;
}
/**
 * 将List抽象化想传什么就传什么
 */
@Test
public void demo4() {

    List<Apple> apples = Arrays.asList(new Apple("1号", "green", 10),
            new Apple("2号", "blue", 20),
            new Apple("3号", "green", 60),
            new Apple("4号", "green", 8),
            new Apple("5号", "red", 80));

    List<Pear> pears = Arrays.asList(new Pear("1号", 10), new Pear("2号", 3));

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);


    List<Apple> list1 = Demo1.filter(apples, (Apple apple) -> StringUtils.equals("red", apple.getColor()));
    List<Pear> list2 = Demo1.filter(pears, (Pear pear) -> pear.getSize() > 1);
    List<Integer> list3 = Demo1.filter(numbers, (Integer i) -> i % 2 == 0);


    System.out.println(list1);
    System.out.println(list2);
    System.out.println(list3);

}

这样就完美了



IT撸码网 - 必读申明1、本站会员可发帖,本主题所有言论和图片纯属会员个人意见,与本论坛立场无关.
2、本站所有帖子由该帖子作者发表,该帖子作者享有帖子相关权益.
3、本帖内容来网友及会员分享和其它网络媒体.
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意!
5、若因内容问题IT撸码网管理员和版主有权不事先通知发贴者而删除本文.
6、本站课程仅供本站会员学习参考,不得传播及用于其他用途,学习完后请在24小时内自行删除.
7、本站资源质量虽均经精心审查,但也难保万无一失,若发现资源有问题影响学习请一定及时点此进行问题反馈,我们会积极为您解决问题!
8、若发现链接失效了点此进行链接失效反馈,我们会第一时间修复链接.

精彩评论0

您需要登录后才可以发帖查看详细内容! 登录 | 立即注册
*
 

本版积分规则