Skip to content

Lambda 使用指南

Lambda 表达式是 Java 8 引入的一个新特性,它是一种函数式编程的方式,可以将函数作为方法的参数传递。Lambda 表达式本质上是一个匿名方法,它可以代替 Java 中的匿名内部类的用法,使得代码更加简洁、清晰。

命令式和函数式

  • 命令式编程:命令 “机器” 如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
  • 声明式编程:告诉 “机器” 你想要的是什么(what),让机器想出如何去做(how)。

什么是函数式编程?

在完成一个编程任务时,通过使用不可变的值或函数,对其进行处理,然后得到另一个值的过程。

函数描述符

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名,这种抽象方法叫作函数描述符。

函数式接口,类型推断

函数式接口定义且只定义了一个抽象方法,因为抽象方法的签名可以描述Lambda表达式的签名。 函数式接口的抽象方法的签名称为函数描述符。

Java 8 中的常用函数式接口

函数式接口函数描述符原始类型特化
Predicate<T>T->booleanIntPredicate LongPredicate DoublePredicate
Consumer<T>T->voidIntConsumer LongConsumer DoubleConsumer
Function<T,R>T->RIntFunction<R> IntToDoubleFunction IntToLongFunction LongFunction<R> LongToDoubleFunction LongToIntFunction DoubleFunction<R> ToIntFunction<T> ToDoubleFunction<T> ToLongFunction<T>
Supplier<T>()->TBooleanSupplier IntSupplier LongSupplier DoubleSupplier
UnaryOperator<T>T->TIntUnaryOperator LongUnaryOperator DoubleUnaryOperator
BinaryOperator<T>(T,T)->TIntBinaryOperator LongBinaryOperator DoubleBinaryOperator
BiPredicate<L,R>(L,R)->boolean
BiConsumer<T,U>(T,U)->voidObjIntConsumer<T> ObjLongConsumer<T> ObjDoubleConsumer<T>
BiFunction<T,U,R>(T,U)->RToIntBiFunction<T,U> ToLongBiFunction<T,U> ToDoubleBiFunction<T,U>

Lambdas及函数式接口的例子

使用示例Lambda 的例子对应的函数式接口
布尔表达式(List<String> list) -> list.isEmpty()Predicate<List<String>>
创建对象() -> new Project()Supplier<Project>
消费一个对象(Project p) -> System.out.println(p.getStars())Consumer<Project>
从一个对象中选择/提取(int a, int b) -> a * bIntBinaryOperator
比较两个对象(Project p1, Project p2) -> p1.getStars().compareTo(p2.getStars())Comparator<Project> BiFunction<Project,Project, Integer> ToIntBiFunction<Project, Project>