雙冒號(::)運算符使用(DoubleColon)
其就是對lambda表達式的簡寫。被用作方法的引用。使用lambda表達式會創建匿名方法,但是有時候需要一個lambda表達式只用於調用一個已經存在的方法,在此才有了方法引用。
- 靜態方法的引用(static method)
public class Demo {
@Test
public void test() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//靜態方法語法 ClassName::methodName
list.forEach(Demo::print);
}
public static void print(String content){
System.out.println(content);
}
}
- 對象的實例方法引用。
public class Demo {
@Test
public void test() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//靜態方法語法 ClassName::methodName
list.forEach(new Demo()::print);
}
public void print(String content){
System.out.println(content);
}
}
- 對象的超類方法引用
public class Example extends BaseExample{
@Test
public void test() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//對象的超類方法語法: super::methodName
list.forEach(super::print);
}
}
class BaseExample {
public void print(String content){
System.out.println(content);
}
}
- 類構造器引用
public class Example {
@Test
public void test() {
InterfaceExample com = Example::new;
Example bean = com.create();
Example bean = com.create("STRING");
System.out.println(bean);
}
}
interface InterfaceExample{
//不帶參數
Example create();
//帶參數
Example create();
}
- 數組構造器引用
public class Example {
public static void main(String[] args) {
Function <Integer, Example[]> function = Example[]::new;
Example[] array = function.apply(4); //這里的4是數組的大小
for(Example e:array){
System.out.println(e); //如果輸出的話,你會發現會輸出4個空對象(null)
}
}
}