双冒号"::"简单来说就是java8 lambda表达式"- >"的简写。以下一个例子体会以下:
不使用::
public static void main(String[] args) {
List<String> list = Arrays.asList("张三", "李四", "王五");
list.forEach(t -> System.out.println(t));
}
使用::
public static void main(String[] args) {
List<String> list = Arrays.asList("张三", "李四", "王五");
list.forEach(System.out::println);
}
Java 8 中我们可以通过:: 关键字来访问类的静态方法、对象方法、构造方法。
用法 | 举例 | |
---|---|---|
1 | 静态方法的引用 | ContainingClass::staticMethodName |
2 | 对特定对象的实例方法的引用 | containingObject::instanceMethodName |
3 | 对特定类型的任意对象的实例方法的引用 | ContainingType::methodName |
4 | 对构造函数的引用 | ClassName::new |
1、静态方法的引用
public static class Test1 {
public static void doTest1(String s) {
System.out.println(s);
}
}
@Test
void test1() {
List<String> list = Arrays.asList("张三", "李四", "王五");
list.forEach(Test1::doTest1);
}
2、对特定对象的实例方法的引用
public class Test2 {
public void doTest2(String s) {
System.out.println(s);
}
public void doTest3(String s) {
}
}
@Test
void test2() {
List<String> list = Arrays.asList("张三", "李四", "王五");
Test2 test2 = new Test2();
list.forEach(l -> test2.doTest2(l));//等价
list.forEach(test2::doTest2);
}
3、对特定类型的任意对象的实例方法的引用
@Test
void test3() {
List<String> strings = Arrays.asList("张三", "李四", "王五");
strings.stream().sorted((a, b) -> a.compareTo(b));//等价
strings.stream().sorted(String::compareTo);
}
4、对构造函数的引用