什么是Lambda表达式
Lambda表达式是Java8的一个新特性,可以使代码更加的简洁,提高代码可读性(如果没学过Lambda另说)。
以下是百度百科对Lambda的解释:
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
Lambda是一种更加简洁的匿名函数,也可以理解成可以当作参数进行传递的代码。需要注意的是在实现的接口中只能有一个方法,如果是在接口中存在了多个方法,这样就不能用Lambda表达式了。
用法
Lambda一般以箭头分割,左侧是参数,右侧是进行处理的代码。
大概就是这样:
Runnable r = () -> System.out.println("这是一个栗子");
本来在等号的右边应该写一个匿名类,然后在匿名类中写各种代码,如果使用Lambda表达式直接一行就行了。
然后Lambda大概有以下几种类型:
- 无参数无返回值
- 无参数有返回值
- 有参数无返回值
- 有参数有返回值
目测就这了,应该没有别的了吧。
无参数无返回值
大约就是下面这种亚子,其中如果只有一行代码的话可以省略右侧的花括号。
() -> {代码}
就像刚刚那个Runnable接口的栗子,老简单了,另外就是如果只有一行代码的话可以省略花括号。
有参数无返回值
这种根据参数的个数不同也有不同的情况,一种参数可以把小括号省略掉,参数多了之后就不能省略括号。但是可以省略参数的类型,这个时候需要参数和对应的方法的参数对应。
x -> {代码}
(int x, int y) -> {代码}
(x, y) -> {代码}
这个是一个简单的小栗子,这个是对列表的迭代。
List<String> list = Arrays.asList("abc", "dae", "daed");
list.forEach((x) -> System.out.println(x));
有参数有返回值
如果是只有一条语句的话可以省略return
如果是多条的话,在花括号最后需要用return返回结果。参数的格式同上。
List<String> list = Arrays.asList("abc", "dae", "daed");
list.sort( (x, y) -> Integer.compare(x.length(), y.length() ) );
函数式接口
因为使用Lambda表达式需要依托接口,函数式接口就是Java官方给我们提供的一些通用的接口,方便我们的使用。另外就是对于函数式接口,会有一个注解:
@FunctionalInterface
来标识这个东西是一个函数式接口,不使用也没啥。
另外需要说明一点,在所有的函数式接口里面只有一个方法,而@FunctionalInterface
也要求接口中有且仅有一个方法。
具体的有很多,在java.util.function
包里面,常用的有以下几个:
- Consumer< T >
- Function< T, R >
- Supplier< T >
- Predicate< T >
Consumer
以下是这个接口的部分代码,简单来说就是传入一个参数,然后进行使用,常用的就是迭代器,输出。
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
}
Function
这个是Function接口的代码,输入一个参数进行处理,然后进行输出。
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
Supplier
输出数据
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
Predicate
输入数据,根据判断的结果进行判断,常用在过滤中。
@FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
}
引用
方法引用
对象的引用 :: 实例方法名
类名 :: 静态方法名
类名 :: 实例方法名
构造器引用
类名 :: new