1. 程式人生 > >Java8新特性(三)方法引用、構造器引用、陣列引用

Java8新特性(三)方法引用、構造器引用、陣列引用

目錄:

1、方法引用

1.1、物件 :: 例項方法

1.2、類 :: 靜態方法

1.3、類 ::例項方法

2、構造器引用

2.1、介紹

2.2、使用

3、陣列引用

3.1、介紹

3.2、使用


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
}