java8中Lambda表达式写法详解
一、是什么?有什么好处?
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码。可以写出更简洁、更灵活的代码。 注:lambda表达式需要函数式接口(接口中只有一个抽象方法的接口,称为函数式接口。 使用注解 @FunctionalInterface 修饰) 的支持。
二、关于lambda表达式的一些写法
1、无参数,无返回值
//内部类实现方式
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello World!"+Thread.currentThread().getName());
}
};
//lambda实现方式
Runnable r1 = () -> System.out.println("Hello Lambda!");
2、有一个参数,无返回值
Consumer<String> con = x -> {
System.out.println(x);
};
con.accept("我是张刚!");
3、有两个参数,有返回值
Comparator<Integer> com = (x, y) -> {
return Integer.compare(x, y);
};
int compare = com.compare(4, 3);
System.out.println(compare);
4、若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y); int compare = com.compare(4, 3); System.out.println(compare);
三、lambda表达式方法引用
🐖:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用。 1. 对象的引用 :: 实例方法名 2. 类名 :: 静态方法名 3. 类名 :: 实例方法名
1、对象的引用 :: 实例方法名 前提:方法引用所引用的方法(println方法)的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
PrintStream ps = System.out;
Consumer<String> con = (str) -> ps.println(str);
con.accept("Hello World!");
System.out.println("--------------------------------");
Consumer<String> con2 = ps::println;
con2.accept("Hello Java8!");
2、类名 :: 静态方法名 方法引用所引用的方法(compare方法)的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致! 并且所引用的方法(compare方法)必须是静态方法
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
com.compare(1,2);
System.out.println("-------------------------------------");
Comparator<Integer> com2 = Integer::compare;
com2.compare(1,2);
3、类名 :: 实例方法名 若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
System.out.println(bp.test("abc", "abc"));
System.out.println("--------------------------------");
BiPredicate<String, String> bp2 = String::equals;
System.out.println(bp2.test("abc", "abc"));
四、lambda表达式构造器引用
🐖:和方法引用一样,写法如下:
基础类:
@Data //该注解需要引用lombok包
class Employee {
private int id;
private String name;
private int age;
private double salary;
}
1、类名::new 构造器的参数列表,需要与函数式接口中参数列表保持一致!
Function<String, Employee> fun = (str) -> new Employee();
Employee apply1 = fun.apply("a");
System.out.println("--------------");
Function<String, Employee> fun2 = Employee::new;
Employee apply2 = fun2.apply("a");
2、类型[] :: new
Function<Integer, String[]> fun = (args) -> new String[args];
String[] strs = fun.apply(10);
System.out.println(strs.length);
System.out.println("--------------------------");
Function<Integer, Employee[]> fun2 = Employee[]::new;
Employee[] emps = fun2.apply(10);
System.out.println(emps.length);
下一篇:
Java入门(一)java中的分隔符号
