Java1.8新特性

Lambda表达式

    /**
     * Lambda表达式的使用
     * 1. 举例: (o1,o2) -> Integer.compare(o1,o2)
     * 2. 格式:
     *          -> : Lambda操作符 或 箭头操作符
     *          -> : 左边 lambda形参列表 (其实就是接口中的抽象方法的形参列表)
     *          -> : lambda体 (其实就是重写的抽象方法的方法体)
     * 3. lambda表达式的使用 : ( 分为六种情况)
     *        总结:
     *          -> 左边 : Lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对小括号可以省略
     *          -> 右边 : Lambda体应该使用一对{} 包裹; 如果lambda体只有一条执行语句(可能是 return 语句),可以省略这一对{}和return关键字;
     * 4. lambda表达式的本质 : 做为函数式接口的实例
     *
     * 5. 如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口
     *
     * 6. 所以以前用匿名实现类表示的现在都可以用Lambda表达式来写。
     */



    /**
     * java内置的四大核心函数式接口
     *
     * 消费型接口 Consumer<T>    void accept(T t)
     * 供给型接口 Supplier<T>    T get()
     * 函数式接口 Function<T,R>  R apply(T t)
     * 断定型接口 Predicate<T>   boolean test(T t)
     */

image-20200908224820020

image-20200908224927171

image-20200908230105152

1.无参,无返回值

    @Test
    public void test1(){
         Runnable r1 = new Runnable(){
             @Override
             public void run() {
                 System.out.println("我爱北京天猫");
             }

         };
         r1.run();
         Runnable runnable = ()-> System.out.println("我爱添加");
         runnable.run();

    }

2.需要一个参数,但是没有返回值

    @Test
    public void test2(){
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("谎言和誓言的区别是什么?");
        System.out.println("**********************");
        Consumer<String> consumer1 = (String s) -> {
            System.out.println(s);
        };
        consumer1.accept("一个是听得人当真了,一个是说的人当真了");

    }

3.数据类型可以省略,因为可以由编译器推断得出,称为类型推断

   @Test
    public void test3(){
        Consumer<String> consumer = s -> {
            System.out.println(s);
        };
        consumer.accept("今天不学习,明天变垃圾");
    }

4 Lambda 若只需要一个参数时,参数的小括号可以省略

    @Test
    public void test4(){
        Consumer<String> consumer = s -> {
            System.out.println(s);
        };
        consumer.accept("学是学不进去了,睡又不敢睡");
    }

5.Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值

    @Test
    public void test5(){
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(comparator.compare(12,21));
        System.out.println("****************");
        Comparator<Integer> comparator1 = (o1,o2) -> {
          System.out.println(o1);
          System.out.println(o2);
          return o1.compareTo(o2);
        };
        System.out.println(comparator1.compare(12,6));
    }

6. 当Lambda体只有一条语句时,return 与大括号 若有,都可以省略

    @Test
    public void test6(){
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };
        System.out.println(comparator.compare(12,21));
        System.out.println("****************");
        Comparator<Integer> comparator1 = (o1,o2) ->o1.compareTo(o2);
        System.out.println(comparator1.compare(12,6));
    }

image-20201030210811771

7. 消费型接口

    @Test
    public void test8(){
        happyTime(500, new Consumer<Double>() {
            @Override
            public void accept(Double aDouble) {
                System.out.println("学习太累了,去天上人间买了瓶矿泉水,价格为: " + aDouble);
            }
        });
        System.out.println("***************************");
        happyTime(400,money -> System.out.println("学习太累了,去天上人间买了瓶矿泉水,价格为: " + money));

    }

    void happyTime(double money,Consumer<Double> con){
        con.accept(money);
    }




8.自定义函数式接口

/**
 * @author caoweifeng
 * @version 1.00
 * @date 2020/10/30 21:04
 */
@FunctionalInterface
public interface MyInterface {

    void method();
}