java8之lambda表達式(構造器引用)

構造器引用同方法引用相似,不一樣的是在構造器引用中方法名是new。例如,Button::new表示Button類的構造器引用。對於擁有多個構造器的類,選擇使用哪一個構造器取決於上下文。假設你有一個字符串列表,而且但願調用Button類的構造器使用列表中的字符串來構造一個按鈕列表,可使用以下表達式:java

List<String> labels = ....;
Stream<Button> stream = labels.stream().map(Button::new);
List<Button> buttons = stream.collect(Collectors.toList());

後面咱們會詳細討論stream,map和collect方法。可是如今,重要的是對於每一個列表元素,map方法會調用Button(String)構造器。雖然Button類有多個構造器,可是編譯器會從上下文中推斷並挑選只帶一個String參數的構造器。數組

你可使用數組類型來編寫構造器引用。例如,int[]::new是一個含有一個參數的構造器引用,這個參數就是數組的長度。它等同於lambda表達式 x -> new int[x]。數組構造器引用能夠用來繞過java中的一個限制。在Java中,沒法構造一個泛型類型T的數組。表達式 new T[n]是錯誤的,由於它會被擦除爲new Object[n]。code

對於編寫API的開發人員來講是一個問題。例如,假設咱們但願構造一組按鈕,Stream接口中有一個返回Object數組的toArray()方法:對象

Object[] buttons = stream.toArray();

但這並不能讓咱們滿意。用戶但願一組按鈕對象,而不是一組Object對象。Stream API經過構造器引用解決了這個問題。它容許將Button[]::new傳遞給toArray方法:接口

Button[] buttons = stream.toArray(Button[]::new);

toArray方法會調用該構造器來得到一個正確類型的數組。而後它會填充並返回該數組。
開發

相關文章
相關標籤/搜索