一、Java新特性
-
Lambda表达式
-
函数式接口
-
方法引用
-
作用:在Java中主要用在Lambda表达式和方法引用(想使用Lambda表达式,接口必须为函数式接口)。
JDK8专门提供了@FunctionalInterface注解,用来进行编译检查。
已经使用过的函数式接口,比如Comparator等,多线程阶段学习的函数式接口有Runnable、Callable等。
注意:Comparable并没有被标记为函数式接口
内置的函数式接口
-
Consumer<T>:消费型接口(void accept(T t))。有参数,无返回值。
-
Supplier<T>:供给型接口(T get())。只有返回值,没有入参。
-
Function<T, R>:函数型接口(R apply(T t))。一个输入参数,一个输出参数,两种类型不可不同、可以一致。
-
Predicate<T>:断言型接口(boolean test(T t))。输入一个参数,输出一个boolean类型得返回值。
| 函数式接口 | 方法名 | 输入参数 | 输出参数 | 作用 |
|---|---|---|---|---|
| 消费型接口Consumer | void accept(T t) | T | void | 对类型为T的对象进行操作 |
| 供给型接口Supplier | T get() | void | T | 返回类型为T的对象 |
| 函数型接口Function | R apply(T t) | T | R | 对类型为T的对象进行操作,返回类型为R的对象 |
| 断言型接口Predicate | boolean test(T t) | T | boolean | 对类型为T的对象进行操作,返回布尔类型结果 |
-
有返回值的Lambda表达式,如果方法体只有一条返回语句,可同时省略return和{}。
-
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。
-
Lambda 规定接口中只能有一个需要被实现的抽象方法,不是规定接口中只能有一个方法,称为函数式接口。
->左面: 参数类型可以省略不写,自动类型推断。
如果只有一个参数,()可以省略不写。
->右侧: {}将方法体的具体内容包裹起来。
方法体中只有一条执行语句,{}可以省略不写。
public class TestMethodRef1 { public static void main(String[] args) { //使用匿名内部类实现 Consumer consumer = new Consumer<Integer>() { @Override public void accept(Integer i) { System.out.println(i); } }; consumer.accept(56); //使用lambda表达式实现 Consumer<Integer> consumer1 = (i)->System.out.println(i); consumer1.accept(56); //使用方法引用 Consumer<Integer> consumer2 = System.out::println; consumer2.accept(56); } }
-
对象引用::实例方法名
-
类名::静态方法名
-
类名::实例方法名
-
类名::new (也称为构造方法引用)
-