先来看几个例子,主要练习策略模式:

Java8内置四大核心函数式接口-LMLPHPJava8内置四大核心函数式接口-LMLPHP

用策略模式的做法

定义个接口

Java8内置四大核心函数式接口-LMLPHPJava8内置四大核心函数式接口-LMLPHP

其实像这样的接口并不需要我们自己创建

java8推出的Lambda表达式主要就是为了简化开发,而Lambda表达式

的应用主要是针对与函数式接口,自然也推出了对应的一些接口

/**
 * Java8 内置的四大核心函数式接口
 *
 * Consumer<T> :消费型接口
 *      void accept(T t);
 *
 * Supplier<T> :供给型接口
 *      T get();
 *
 * Function<T,R> :函数型接口
 *      R apply(T t)
 *
 * Predicate<T> :断言型接口
 *      boolean test(T t)
 */
/**
 * Java8 内置的四大核心函数式接口
 *
 * Consumer<T> :消费型接口
 *      void accept(T t);
 *
 * Supplier<T> :供给型接口
 *      T get();
 *
 * Function<T,R> :函数型接口
 *      R apply(T t)
 *
 * Predicate<T> :断言型接口
 *      boolean test(T t)
 */
public class TestLambda2 {

    //Consumer<T> 消费型接口
    @Test
    public void test01(){
//        Consumer<Double> con=new Consumer<Double>() {
//            @Override
//            public void accept(Double aDouble) {
//                System.out.println(aDouble);
//            }
//        };
        happy(1000, x-> System.out.println("消费了"+x+"元"));
    }
    //出去玩
    public void happy(double money, Consumer<Double> con){
        con.accept(money);
    }

    //Supplier<T> 供给型接口:
    @Test
    public void test02(){
        List<Integer> numList = getNumList(10, () ->
                //new Random().nextInt()//产生随机数  这里可以决定你要产生的是什么数
                (int)(Math.random()*100)
        );
        System.out.println(numList);
    }

    //产生指定个数的整数,并放入集合中
    public List<Integer> getNumList(int num, Supplier<Integer> sup){
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<num;i++){//该for循环作用是产生多少个整数
            Integer integer = sup.get();//而具体产生什么样的数,由Supplier的实现去指定
            list.add(integer);
        }
        return list;
    }

    //Function<T,R> 函数型接口   对传入的参数T进行某种处理  返回需要的R
    @Test
    public void test03(){
        int hello_function = handlerStr("Hello Function", x -> x.length());
        System.out.println(hello_function);
    }
    //例如 希望传入一个字符串  返回一个字符串长度
    public int handlerStr(String str, Function<String,Integer> func){
        return func.apply(str);
    }

    private List<User> list= Arrays.asList(
            new User("张三",18,3000.0),
            new User("李四",28,9000.0),
            new User("王五",48,8000.0),
            new User("赵六",13,5000.0),
            new User("田七",25,13000.0)
    );

    //Predicate<T> :断言型接口
    @Test
    public void test04(){
        List<User> filter = filter(list, x -> x.getAge() > 28);
        System.out.println(filter);
    }
    //比如说将满足条件的放到集合中
    public List<User> filter(List<User> list, Predicate<User> pre){
        List<User> userList=new ArrayList<>();
        for(User user:list){
            if(pre.test(user)){
                userList.add(user);
            }
        }
        return userList;
    }
}
01-09 18:45