Lambda表达式的高级用法
一、构造方法引用
注意:构造器的参数列表,需要与函数式接口中参数列表保持一致!
使用格式:类名 :: new
public class User {
private String name;
private Integer age;
public User() {
super();
}
public User(String name) {
super();
this.name = name;
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
1、用Lambda表达式实现分别通过User的无参构造器和一个有参构造器获得User对象
@Test
public void test5(){
Supplier<User> supplier =
() -> {return new User();}; //() -> new User();如果Lambda体中只有一条语句,可以省略return
User user1 = supplier.get();
System.out.println("user1 : " + user1);
System.out.println("-----------------------------------");
Function<String, User> function =
(x) -> {
User user = new User(x);
return user;
};
User user = function.apply("lzj");
System.out.println("user : " + user);
}
2、Lambda的构造器引用分别实现通过User的无参构造器和一个有参构造器获得User对象
@Test
public void test6(){
Supplier<User> supplier = User::new;
/*get方法无参,有返回值,所以调用的User的无参构造器,返回User对象*/
User user1 = supplier.get();
System.out.println("user1 : " + user1);
System.out.println("-----------------------------------");
Function<String, User> function = User::new;
/*apply方法有一个参数,有返回值,所以调用User的一个参数的构造器,并返回User对象*/
User user = function.apply("lzj");
System.out.println("user : " + user);
}
两种方式输出结果相同:
user1 : User [name=null, age=null]
-----------------------------------
user : User [name=lzj, age=null]
2、静态方法引用
使用格式:类名 :: 静态方法名
例如我们要用Comparator接口的compare方法实现比较两个整数值的大小
1、用Lambda表达式表示如下
@Test
public void test3(){
Comparator<Integer> comparator =
(x, y) -> {
Integer differ = x < y ? -1 : ((x == y) ? 0 : 1);
return differ;
};
Integer differ1 = comparator.compare(10, 5);
System.out.println("differ1 : " + differ1);
}
3、实例方法引用
使用格式1:类名 :: 实例方法名
示例:用Lambda表达式实现比较两个字符串的大小
@Test
public void test4(){
BiPredicate<String, String> bp =
(x, y) -> {
Boolean flag = x.equals(y);
return flag;
};
Boolean flag = bp.test("pp", "pp");
System.out.println("flag : " + flag);
}
使用格式2:对象的引用 :: 实例方法名
用Lambda表达式实现打印字符串
@Test
public void test1(){
Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("ppya");
}
4.Lambda的数组引用
@Test
public void test7(){
Function<Integer, String[]> function =
(x) -> new String[x]; //省略retuen的写法
String[] ss = function.apply(5);
System.out.println("ss.length : " + ss.length);
Function<Integer, String[]> function1 = String[]::new;
String[] sss = function1.apply(5);
System.out.println("sss.length : " + sss.length);
}