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;
posted @ 2022-05-13 15:09  Ranger-dev  阅读(88)  评论(0编辑  收藏  举报