Java提升二:Lambda表达式与方法引用

1、Lambda表达式

1.1、定义

lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式。它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达式则更为简洁。

1.2、使用

lambda表达式的写法:
(需要实现的方法的参数)->{对于方法的具体实现}

代码展示:

先定义一个函数式接口,并定义方法使用函数式接口。

//函数式接口
 interface Cook{
    //无参数无返回值的抽象方法
    public void cooking(String person);
}
//函数式接口作为方法的参数使用
  public static void invokeCook(String person,Cook cook){
        cook.cooking(person);
    }

若使用匿名内部类进行实现:

//使用匿名内部类实现Cook接口中的方法重写
        invokeCook("小明", new Cook() {
            @Override
            public void cooking(String person) {
                System.out.println(person+"快做饭");
            }
        });

改用lambda表达式优化:

 //使用lambda表达式实现Cook接口中的方法重写
        invokeCook("小明",(person)->{
            System.out.println(person+"快做饭");
        });
    }

使用lambda表达式传参时,()中所传入的参数名可以不带类型标识符,但参数名必须于函数式接口中的方法的形参名保持一致。当lambda表达式要传递的参数为单参,且实现语句为单句时,可改写为如下形式:

 //使用lambda表达式实现Cook接口中的方法重写
   invokeCook("小明",person->System.out.println(person+"快做饭");
        );
    }

1.3、总结

(1) lambda表达式针对于函数式接口使用,使用形式简便,使用范围较小。
(2) lambda表达式是匿名内部类的进一步提炼优化,称为匿名内部类的语法糖。
(3) lambda表达式()中传入的参数是要实现的函数式接口中的抽象方法的形参。

2、方法引用

2.1、定义

方法引用是用来直接访问类或者实例已经存在的方法(注意:不是创建或实现方法)或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。运行时,方法引用会创建函数式接口的一个实例。

2.2、使用

方法引用的写法:类名::已存在的方法

代码展示

先定义一个函数式接口,并定义方法使用函数式接口。

//函数式接口
@FunctionalInterface
interface Printable{
    //打印字符串的抽象方法
    void printMethod(String s);
}
 //定义一个方法,参数传入函数式接口,对字符串进行打印
  public static void printString(Printable p){
        p.printMethod("hellowrold");
    }

若使用匿名内部类进行实现:

 //使用匿名内部类实现
        printString(new Printable() {
            @Override
            public void printMethod(String s) {
                System.out.println(s);
            }
        });

改用lambda表达式优化:

 //调用printString方法,因为参数是函数式接口,可以使用Lambda表达式
        printString((s)->{
            System.out.println(s);
        });

用方法引用优化:

 //使用方法引用
 //对象System.out已经存在,方法println也已经存在,
 //可直接使用方法引用简化lambda表达式。
  printString(System.out::println);

2.3、总结

(1)方法引用仅针对于函数式接口使用,调用函数式接口的抽象方法时,类名::方法表示的就是对于抽象方法的实现代码;调用其他方法时,都是只能调用类中已经存在的方法。
(2)方法引用与lambda表达式相比较,方法引用的使用范围更小,方式更简洁,便于在大量复用
(3)总体而言,方法引用是lambda表达式的语法糖。

posted @ 2020-02-05 19:51  zjL1997  阅读(311)  评论(0编辑  收藏  举报