方法引用:当在使用lambda表达式书写时,如果只是调用一个方法,就可以用方法应用代替,可以使代码更加简洁
package com.core;
import lombok.Builder;
import lombok.Data;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class JDK8Test {
@Test
public void methodReferenceTest(){
List<Student> list = new ArrayList<>();
list.add(new Student.StudentBuilder().name("张三").build());
list.add(new Student.StudentBuilder().name("李四").build());
list.add(new Student.StudentBuilder().name("王五").build());
list.forEach((s)->System.out.println(s));
list.forEach(System.out::println);
}
}
@Data
@Builder
class Student{
private String name;
public Student(String name) {
this.name = name;
}
}
这2行代码是等价的,因为在lamda体中只是调用了一个方法,所以可以改写成方法引用。
list.forEach((s)->System.out.println(s));
list.forEach(System.out::println);
使用方法引用参数和返回值,必须和原lamda体中保持一致。
方法引用
方法引用包括,
- 特定类的任意对象的方法引用
- 静态方法引用
- 构造器方法引用
- 特定实例方法应用
package com.core;
import lombok.Builder;
import lombok.Data;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
public class JDK8Test {
List<Student> list = null;
@Before
public void before(){
list = new ArrayList<>();
list.add(new Student.StudentBuilder().name("张三").build());
list.add(new Student.StudentBuilder().name("李四").build());
list.add(new Student.StudentBuilder().name("王五").build());
}
@Test
public void methodReferenceTest(){
list.forEach((s)->System.out.println(s));
list.forEach(System.out::println);
}
@Test
public void methodReference2Test(){
//特定类任意方法调用
list.forEach(Student::method1);
//静态类方法引用
Consumer<String> consumer = (s) -> Student.method2(s);
consumer.accept("张三");
Consumer<String> consumer2 = Student::method2;
consumer.accept("李四");
//构造器方法应用,参数需保持一致,无论有参,无参
Function<String,Student> function = (name)-> new Student(name);
Function<String,Student> function1 = Student::new;
//特定实例方法引用
Student student = new Student("王五");
Consumer<String> consumer3 = student::setName;
consumer3.accept("麻六");
System.out.println(student);
}
}
@Data
@Builder
class Student{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public void method1(){
System.out.println(this.name+":的特定类任意方法调用");
}
public static void method2(String name){
System.out.println(name +"的静态类方法调用");
}
}