lambda
是什么?
lambda 可以简洁地表示可传递的匿名函数的一种方式。
- 匿名
不需要确切指定一个名称。
- 函数
它不想方法那样隶属于某个特定的类。
但是和普通方法一样拥有参数列表,函数主题,返回类型,还有可能抛出异常列表。
- 传递
可以作为参数传递给方法或者存储在变量中。
- 简洁
无需像匿名类那样写很多模板代码。
例子
- 先前
Comparator<Apple> byWeight = new Comparator<Apple>(){
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
};
- 现在
Comparator<Apple> byWeight =
(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight());
基础语法
(parameters)->expression
或者
(parameters)->{statements;}
使用案例
使用案例 | lambda 示例 |
---|---|
布尔表达式 | (List<String> list)->list.empty() |
创建对象 | ()->new Apple(10) |
消费一个对象 | (Apple a)->{ System.out.println(a.getWeight())} |
从一个集合中选择 | (String s) -> s.length() |
组合两个数 | (int a, int b)->a*b |
比较2个对象 | (Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()) |
使用场景
- 在哪里使用
当我们对 lambda 有个基础的了解之后,那么在什么地方可以使用呢?
函数式接口
函数接口就是只定义一个抽象方法的接口。
比如:
- Predicate.java
/**
* Represents a predicate (boolean-valued function) of one argument.
* @since 1.8
*/
@FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*/
boolean test(T t);
}
@FunctionalInterface
这个注解用于表示接口会设计成一个函数式接口。
但是却不是必须的,类似于@Override
,使用它是一种优秀的习惯。
- 简单使用
比如说Runnable
,此时匿名内部类略显繁琐。
/**
* 函数式接口案例
* @author bbhou
* @version 1.0.0
*/
public class FunctionalInterfaceDemo {
public static void main(String[] args) {
progress(new Runnable() {
@Override
public void run() {
System.out.println("Hell World");
}
}); //0. 匿名内部类
Runnable runnable = ()-> System.out.println("Hello world"); //1. lambda
progress(runnable);
progress(()-> System.out.println("Hello world")); //2. 直接使用 lambda
}
/**
* 执行 Runnable
* @param runnable 可运行
*/
private static void progress(Runnable runnable) {
runnable.run();
}
}
函数描述符
函数式接口的抽象方法的签名基本上就是 lambda 表达式的签名。
我们将这种抽象方法叫作函数描述符。
比如 Runnable
接口,可以看做一个什么也不接受,什么也不返回(void)的函数的签名。