Java8新特性——Lambda的理解以及和函数式接口介绍

Lambda表达式

  • 一,Lambda表达式
    • 1.什么是Lambda表达式?
    • 2.为什么要使用Lambda表达式?
    • 3.Lambda的语法
  • 二,函数式接口:
    • 1.定义:
    • 2.Java内置函数式接口
  • 三,方法引用

一,Lambda表达式

1.什么是Lambda表达式?

Lambda针对的是接口,其本质是作为函数式接口的实例对象。
Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:

左侧:指定了 Lambda 表达式需要的参数列表
右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即Lambda 表达式要执行的功能。

2.为什么要使用Lambda表达式?

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

3.Lambda的语法

语法格式一:无参,无返回值

Runnable r1 = new Runnable() {
public void run() {
System.out.println(“123”);
}
};

运用Lambda表达式:

Runnable r2 = () -> {
System.out.println(“123”);
};

语法格式二:Lambda 需要一个参数,但是没有返回值。

Consumer con = new Consumer() {
public void accept(String s) {
System.out.println(s);
}
};

运用Lambda表达式:

Consumer con1 = (String s) -> {
System.out.println(s);
};
}

语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

Consumer con1 = (String s) -> {
System.out.println(s);
};

运用Lambda表达式:

Consumer con2 = (s) -> {
System.out.println(s);
};

语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略

Consumer con1 = (s) -> {
System.out.println(s);
};

运用Lambda表达式:

Consumer con2 = s -> {
System.out.println(s);
};

语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值

Comparator com1 = new Comparator() {
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};

运用Lambda表达式:

Comparator com2 = (o1,o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};

语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略

Comparator com1 = (o1,o2) -> {
return o1.compareTo(o2);
};

运用Lambda表达式:

Comparator com2 = (o1,o2) -> o1.compareTo(o2);

当为接口提供一个具体的实现类的对象时,用到了Lambda,接口有要求,接口只能有一个抽象方法
既然只能有一个抽象方法,那么在提供实例的时候,就没要必要知道方法的名字是什么,只有一个,那么重写的时候肯定是那个方法,所以方法名可以省略
而且是一个匿名的接口实现类,new的时候也一定是这个接口,所以这部分也可以省略

二,函数式接口:

1.定义:

如果一个接口中,只声明了一个抽象方法,则此接口为函数式接口(java1.8提出)
我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。

2.Java内置函数式接口

Java8新特性——Lambda的理解以及和函数式接口介绍_第1张图片

三,方法引用

基于Lambda表达式
1.使用情境:
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以 方法引用,也是函数式接口的实例。
3. 使用格式: 类(或对象) :: 方法名
4. 方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的 形参列表和返回值类型相同!
5. 注意:当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数)时:ClassName::methodName.

Consumer中的void accept(T t)
PrintStream中的void println(T t)

Consumer con1 = str -> System.out.println(str);

方法引用

Consumer con2 = ps::println;

你可能感兴趣的:(Java基础,java,开发语言,面试)