“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
/**
* 无参数、无返回值,以Runnable为例
*/
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
// 调用
Runnable r = () -> System.out.println("单个方法、无参数、无返回值");
new Thread(r).start();
// 最后简写
new Thread(() -> System.out.println("单个方法、无参数、无返回值")).start();
// 如果有多行加{}
new Thread(() -> {
System.out.println("line1: 单个方法、无参数、无返回值");
System.out.println("line2: 单个方法、无参数、无返回值");
}).start();
/**
* 有参数、无返回值
*/
public interface LambdaDemo1 {
void run(String hello);
}
// 执行LambdaDemo1方法
public class LambdaWrapDemo1 {
void test(String value, LambdaDemo1 lambdaDemo1) {
lambdaDemo1.run(value);
}
}
// 调用
LambdaWrapDemo1 wrap = new LambdaWrapDemo1();
wrap.test("hello", (x) -> System.out.println(x));
/**
* 有参数、有返回值
*/
LambdaWrapDemo1 lambdaWrapDemo1 = new LambdaWrapDemo1();
lambdaWrapDemo1.test("hello", (x) -> {
System.out.println(x);
return x;
});
jdk8 lambda常用语法
// 查询ID大于1的集合,并且打印出来
List<User> filterUsers = users.stream().filter(user -> user.getId() > 1).collect(Collectors.toList());
filterUsers.forEach(u -> System.out.println(u.getName()));
// 查询ID大于1的集合总数
users.stream().filter(user -> user.getId() > 1).count();
// 获取集合中NAME转成List
List<String> names = users.stream().map(User::getName).collect(Collectors.toList());
names.stream().forEach(x -> System.out.println(x));
// 获取集合第一个User如果为空跑抛出异常
User filterUser = users.stream().filter(user -> user.getId() == 4).findFirst().orElseThrow(() -> new NullPointerException("用户未找到"));