java-函数式编程
Lambda表达式
Java8引入函数式编程风格,可以理解为一种匿名函数的替代,通过行为参数化传递代码
形式
(parameters)-> expression
(parameters)->{ statement;}
// 例子
() -> System.out.print(1);
name->System.out.print(name);
() -> {
System.out.print(1);
System.out.print(2);
}
(x,y)->x + y;
(Long x,Long y)-> x + y;
函数式接口
- 接口中(必须)只有一个抽象方法
- Java8函数式接口注解@FunctionInterface (只是帮助编译器校验接口中是否只有一个抽象方法。不一定要有)
- 函数式接口的抽象方法的签名基本上就是Lambda表达式的签名,我们将这种抽象方法称之为函数描述符
常用函数式接口
接口 | 参数 | 返回类型 | 描述 |
---|---|---|---|
Predicate |
T | boolean | 用来判别一个对象 |
Consumer |
T | void | 接收一个对象处理不返回值 |
Function<T,R> | T | R | 接收一个对象返回一个对象 |
Supplier |
none | T | 提供一个对象 |
UnaryOperator |
T | T | 接收一个对象返回相同对象 |
BiFunction<T, U, R> | (T,U) | R | 接收2个对象返回一个对象 |
BinaryOperator |
(T,T) | T | 接收2个相同对象返回相同对象 |
还有一些基础类型的函数式接口 如IntFunction。。好处是不用装箱拆箱,性能较好
方法引用
方法引用是调用特定方法的 Lambda 表达式的一种快速写法,可以让你重复使用现有方法定义,并像Lambda 表达式一样传递
// 指向静态方法的方法引用
(args) -> ClassName.staticMethod(args);
ClassName::staticMethod;
Consumer<String> a = (String s) -> Integer.parseInt(s);
Consumer<String> b = Integer::parseInt;
// 指向任意实例方法的方法引用
(args) -> args.instanceMethod();
ClassName::instanceMethod;
Consumer<String> c = (String s) -> s.length();
Consumer<String> d = String::length;
// 指向现有对象的实例方法引用
(args) -> object.instanceMethod(args);
object::instanceMethod;
StringBuilder stringBuilder = new StringBuilder();
Consumer<String> e = (String s) -> stringBuilder.append(s);
Consumer<String> f = stringBuilder::append;