面向函数式编程是一种编程范式,是面向数学的抽象,将计算描述为一种表达式求值,其实,函数式程序就是一个表达式。
在 Java8 之前,Java语言一直倡导“一切皆对象”,在 Java 语言中,面向对象就是一切。但是随着 python 、scala 等语言的兴起和新技术的挑战,Java 不得不做出调整以支持更加广泛的技术要求。Java8 开始,Java开始支持 OOF (面向函数编程)
函数式接口函数式接口:只声明了一个抽象方法的接口通过 @FunctionalInterface 注解声明一个函数式接口。声明后,无法在接口中定义第二个方法在 java.util.function 包中定义了丰富的函数式接口
Java 内置的四大核心函数式接口
| 函数式接口 | 接口类型 | 内含抽象方法 | 参数类型 | 返回类型 |
|---|---|---|---|---|
| Consumer | 消费型接口 | void accept(T t) | T | void |
| Supplier | 供给型接口 | T get() | T | |
| Function | 函数型接口 | R apply(T t) | T | R |
| Predicate | 断定型接口 | boolean test(T t) | T | boolean |
调用函数式接口时,使用 Lambda 表达式创建该接口的对象实例以简化代码
Walkable walkable = () -> System.out.println("走路")
->:Lambda 操作符
-> 左边:Lambda 形参列表:接口中抽象方法的形参列表
-> 右边:Lambda 体:重写的抽象方法的方法体
public class LambdaTest {
@Test
public void test1() {
Walkable walkable = () -> System.out.println("走路");
walkable.walk();
}
@Test
public void test2() {
Eatable eatable1 = (Integer i) -> System.out.println("吃了" + i + "碗米饭");
eatable1.eat(5);
Eatable eatable2 = d -> System.out.println("吃" + d + "碗米饭");
eatable2.eat(5.5);
}
@Test
public void test3() {
Math math1 = (m1, m2) -> m1 + m2;
System.out.println(math1.operate(5, 6));
Math math2 = (Integer m1, Integer m2) -> {
System.out.print(m1 + "+" + m2 + "=");
return m1 + m2;
};
System.out.println(math2.operate(5, 6));
}
}
方法引用
当要传递给 Lambda 体的操作已经有实现的方法,可以使用方法引用
方法引用可以认作 Lambda 表达式的语法糖
要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致
格式:
Comparator com = Integer :: compare; com.compare(32,21);
三种主要使用情况
对象 :: 实例方法名类 :: 静态方法名类 :: 实例方法名
//通过对象调用实例方法
PrintStream ps = System.out;
Consumer consumer = ps::println;
consumer.accept("beijing");
//通过类调用静态方法
Comparator com = Integer :: compare;
com.compare(32,21);
//通过类调用实例方法
Comparator com = Integer :: compareTo;
构造器引用
Functionfunction = User::new; User tom = function.apply("tom"); System.out.println(tom);



