概述
:: 是Java 8 引入的新特性之一,被称作为方法引用。使用 “::” 可以进一步简化一些使用了lambda表达式的代码,让代码更加简洁。
一般配合stream、forEach使用。
类的静态方法的引用
格式:类名+::+方法名
public class TestMethodRef {
public static void main(String[] args) {
String[] array = {"aaaa", "bbbb", "cccc"};
List<String> list = Arrays.asList(array);
//遍历list 引用静态方法,通过类名+::+方法名的方式
list.forEach(TestMethodRef::print);
HashMap<String, String> map = new HashMap<>();
map.put("aa","11");
map.put("bb","22");
//遍历map
map.forEach(TestMethodRef::print2);
}
public static void print(String s){
System.out.println(s);
}
public static void print2(String k, String v){
System.out.println("k=" + k + ",v=" + v);
}
}
输出:
aaaa
bbbb
cccc
k=aa,v=11
k=bb,v=22
对象的实例方法的引用
格式:对象+::+方法名
public class TestMethodRef {
public static void main(String[] args) {
String[] array = {"aaaa", "bbbb", "cccc"};
List<String> list = Arrays.asList(array);
TestMethodRef methodRef = new TestMethodRef();
//引用实例方法,通过对象+::+方法名的方式
list.forEach(methodRef::print);
}
public void print(String s){
System.out.println(s);
}
}
输出:
aaaa
bbbb
cccc
父类方法的引用
格式:super+::+方法名
public class Test04 extends Test04Fu {
public void test() {
String arr[] =new String[]{"aaa","bbb","ccc"};
List<String> list = Arrays.asList(arr);
//引用父类方法,通过super+::+方法名的方式
list.forEach(super::print);
}
}
class Test04Fu{
void print(String s){
System.out.println(s);
}
}
class Test05{
public static void main(String[] args) {
Test04 test04=new Test04();
test04.test();
}
}
构造器引用
格式:类名+::+new
public class TestMethodRef {
public static void main(String[] args) {
String[] array = {"aaaa", "bbbb", "cccc"};
List<String> list = Arrays.asList(array);
list.forEach(TestMethodRef::print);
//引用构造器使用 类名+::+new
list.forEach(Test::new);
}
public static void print(String s){
System.out.println(s);
}
}
class Test{
public String name;
public Test(String name) {
System.out.println("Test 有参构造");
this.name = name;
System.out.println("name=" + name);
}
public Test() {
System.out.println("Test 无参构造");
}
}
输出:
aaaa
bbbb
cccc
Test 有参构造
name=aaaa
Test 有参构造
name=bbbb
Test 有参构造
name=cccc
相当于list.forEach遍历的每一条数据当作 Test有参构造的传参。