在很多其他语言中函数是一等公民。例如 JavaScript 中函数(Function)和字符串(String)、数字(Number)、对象(Object)等一样是一种数据类型。可以这样定义函数:
也可以将函数作为参数:
在 Java 中函数不是一等公民。如果想要像其他语言一样定义一个函数只能通过定义一个接口来实现,例如 Runnable
在 Java 8 之前,可以通过匿名类的方式来創建 Runnable
:
是不是看起来像 JavaScript 的函数定义:
在 java.util.function
包下定义了大量的函数式接口,每个接口都有且只有一个抽象方法这些接口的区别在于其中的抽象方法的参数和返回值不同。
当一个接口中只有一个方法时(即满足函数式接口定义)此时通过匿名类的语法来编写代码显得比较笨偅。使用 lambda 表达式可以将功能作为参数将代码作为数据。
一个 Lambda 表达式分为以下三个部分:
定义一个函数式接口对象用于求两个 int 之和,包含两个 int 类型参数 x
和 y
返回 x + y
的值:
定义一个函数式接口对象,无参数返回42:
定义一个函数式接口对象,鼡于输出字符串包含一个 String 类型的参数 s
,无返回值:
如果 lambda 表达式只是调用一个已有的方法那么可以直接使用方法引用。
改用方法引用更加简洁:
方法引用有以下几种类型:
1、类名::静态方法名
: 静态方法引用
例如定义一个 max
函数式接口对象用于求两个 int 中的最大值:
2、对象名::非静态方法名
: 对象的方法引用
例如定义一个 println
函数式接口对象,用于输出字符串:
即调用第一个参数 s1
的 concat
方法传入参数 s2
。
}