在使用双冒号前我们要先搞清楚一个问题:为什么要使用双冒号?也就是双冒号的作用是什么。
双冒号的设计初衷是为了化简Lambda表达式
【1】java8中引入了一个新的操作符 :: , 是两个英文半角的冒号, 这个操作符用来引用方法, 其本质也是对接口的一种重写。
【2】::操作符可以引用实例方法,也可以引用静态方法, 引用实例时::前面是实例, 引用静态方法时::前面是类
package Study;
import java.util.ArrayList;
import java.util.List;
public class TestLzw {
protected interface commonFunc {
void apply(String a);
}
public String doAdd(String a){
System.out.println("---doAdd---" + a);
return "";
}
public void addOne(String a){
System.out.println("---addOne---" + a);
addAll(a,this::doAdd);
}
public void addAll(String a, commonFunc commonFunc){
System.out.println("---addAll---" + a);
commonFunc.apply(a); // 其实这里执行的就是doAdd
}
public static void main(String[] args) {
System.out.println("示例一:");
TestLzw test = new TestLzw();
test.addOne("迪丽热巴");
System.out.println("示例二:");
List<String> names = new ArrayList<String>();
names.add("Bush");
names.add("Tom");
names.add("Jim");
TestLzw test1 = new TestLzw();
names.forEach(System.out::println);
System.out.println("引用实例前面是实例-----------------");
names.forEach(test1::printRealName);
System.out.println("引用静态方法前面是类----------------");
names.forEach(TestLzw::printOtherName);
}
public void printRealName(String str) {
System.out.println(str);
}
public static void printOtherName(String str) {
System.out.println(str);
}
}
参考: