双冒号(::)运算符使用(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)
}
}
}