Java8新特性(三)方法引用、構造器引用、陣列引用
阿新 • • 發佈:2018-12-18
目錄:
1、方法引用
若lambda體中的內容有方法已經實現了,我們可以使用"方法引用"(實現抽象方法的引數列表,必須與方法引用方法的引數列表保持一致!)可以理解為方法引用是lambda表示式的另外一種表現形式
。雙冒號形式。
方法引用:使用操作符 “::” 將方法名和物件或類的名字分隔開來。
如下三種主要使用情況 :
- 物件 :: 例項方法
- 類 :: 靜態方法
- 類 ::例項方法
1.1、物件 :: 例項方法
例如:
(x) -> System.out.println(x);
等同於:
System.out::println
1.2、類 :: 靜態方法
例如:
BinaryOperator(Double) bo = (x,y) -> Math.pow(x,y);
等同於:
BinaryOperator(Double) bo = Math::pow;
1.3、類 ::例項方法
前提:第一個引數
是例項方法的呼叫者
,第二個引數
是例項方法的引數
例如:
等同於:
2、構造器引用
2.1、介紹
語法:
ClassName::new;
與函式式介面相結合,自動與函式式介面中方法相容。可以把構造器引用賦值給定義的方法,與構造器引數列表要與介面中抽象方法的引數列表一致!
例如:
等同於:
2.2、使用
實體類 Stu:
public class Stu { private Integer id; private String name; private Integer age; public Stu() { } public Stu(Integer id) { this.id = id; } public Stu(Integer id, Integer age) { this.id = id; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Stu{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
測試用例:
@Test
public void test4(){
//無參構造
Supplier<Stu> stuSupplier = ()-> new Stu();
System.out.println(stuSupplier.get());
//自動匹配類中和介面實現的抽象方法中引數列表一致的構造器(無參構造器)
Supplier<Stu> stuSupplier1 = Stu::new;
System.out.println(stuSupplier1.get());
//Stu{id=null, name='null', age=null}
//有一個引數的構造
Function<Integer,Stu> s1 = (x) -> new Stu(x);
System.out.println(s1.apply(1)); //Stu{id=1, name='null', age=null}
//自動匹配類中和介面實現的抽象方法中引數列表一致的構造器(單個Integer的構造器)
Function<Integer,Stu> s2 = Stu::new;
System.out.println(s2.apply(2)); //Stu{id=2, name='null', age=null}
//有兩個引數的構造 BiFunction<T, U, R> R apply(T t, U u);
BiFunction<Integer,Integer,Stu> bf = (x,y) -> new Stu(x,y);
System.out.println(bf.apply(3,44)); //Stu{id=3, name='null', age=44}
//自動匹配類中和介面實現的抽象方法中引數列表一致的構造器(兩個個Integer的構造器)
BiFunction<Integer,Integer,Stu> bf1 = Stu::new;
System.out.println(bf1.apply(4,55));//Stu{id=4, name='null', age=55}
}
3、陣列引用
3.1、介紹
語法:
Type[]::new;
例如:
等同於:
3.2、使用
//陣列引用 Type[]::new
@Test
public void test5(){
//建立指定長度的字串陣列
Function<Integer,String[]> f1 = (x) -> new String[x];
System.out.println(f1.apply(10).length); //10
Function<Integer,String[]> f2 = String[]::new;//陣列引用 可以直接代替
System.out.println(f2.apply(20).length); //20
}