java中的::是什么?
::双冒号是 java 8 的新特性,被称为方法引用(Method Reference),提供了一种不执行方法的方法,使用::可以进一步简化lambda表达式的代码,使得代码更加简洁。
::方法引用 返回的是一个函数式接口
Consumer<String> fun = System.out::println;
java 8 方法引用有四种形式:
| 种类 | 使用方法 | 对应的lambda表达式 |
|---|---|---|
| 特定对象的实例方法引用 | Object :: instanceMethodName | (a, b, …)->{Object.instanceMethodName(a, b, …);} |
| 静态方法(类方法)引用 | ClassName:: staticMethodName | (a, b, …)->{ClassName.staticMethodName(a, b, …);} |
| 类型上的实例方法引用 | ClassName:: instanceMethodName | (a, b, …)->{a.instanceMethodName(b, …);} |
| 构造器引用 | ClassName:: new | (a, b, …)->{new ClassName(a, b, …);} |
Object 是指实例对象,ClassName 是指类名,instanceMethodName 是指实例方法,staticMethodName 是指静态方法,new 是指类的构造函数
Object :: instanceMethod 的一个经典用法是 System.out::println ,System.out::println 等价于Lambda表达式 s -> System.out.println(s)
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c");
// lambda表达式
list.forEach(s->System.out.println(s));
// ::方法引用
list.forEach(System.out::println);
}
【匿名内部类 → lambda表达式 → ::方法引用】的代码简化之路
public class Test {
public static void main(String[] args) {
final SaleMethod saleMethod = new SaleMethod();
// 匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
saleMethod.method_01();
}
}).start();
// lambda表达式
new Thread(()->{saleMethod.method_01();}).start();
// ::方法引用
new Thread(saleMethod::method_01).start();
}
}
class SaleMethod {
public synchronized void method_01() {
System.out.println("method_01 start");
try {
System.out.println("method_01 execute");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("method_01 end");
}
}
总结:
::方法引用 和 Lambda表达式结合使用,可以进一步简化代码。但它在一定程度上增加了代码的理解难度。为了代码的可读性,没有必要刻意去使用::方法引用。