双冒号(::)运算符在Java 8中被用作方法引用(method reference)
lambda 表达式允许4种方式的双冒号
object::instanceMethod
object::instanceMethod
的一个典型用法就是 System.out::println
。
//点击println查看源码 只写了重要部分,便于理解
public class PrintStream extends FilterOutputStream{
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
}
//点击System查看源码
public final class System {
public final static PrintStream out = null;
}
我们再来看一看list.foreach的源码
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
从上面的源码可知我们需要一个Consumer函数式接口
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
函数式接口可以通过lambda方式来调用
Consumer consumer = (x) -> { System.out.println(x) }
//x就表示 accept(T t)中的t
//consumer就是闯入foreach的参数
示例
@Test
public void test() {
List<String> list = Arrays.asList("a", "b", "c");
//Java 7
for(String s:list){
System.out.println(s);
}
//Java 8
list.forEach(System.out::println);
}
class : : staticMethod
public class Example02 {
@Test
public void test() {
List<String> list = Arrays.asList("a", "b", "c");
//静态方法语法 ClassName::methodName
list.forEach(example02::print);
}
public static void print(String content) {
System.out.println(content);
}
}
//结果循环调用了print方法三次:a b c
class : : instanceMethod
public class Example02 {
@Test
public void test() {
List<String> list = Arrays.asList("a", "b", "c");
//对象实例语法 instanceRef::methodName
list.forEach(new example02()::print);
}
public void print(String content){
System.out.println(content);
}
}
//结果 a b c
参考文章:https://blog.csdn.net/zhoufanyang_china/article/details/87798829
原文:https://www.cnblogs.com/lanxinren/p/14715693.html