双冒号(::)
英文:double colon,双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。为此,方法引用需要有兼容的函数接口组成的目标类型上下文。
::关键字提供了可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,::关键字可以使语言更简洁,减少冗余代码。
方法引用(::)使用的前提条件:
1.满足lambda的相关条件,即:可以使用lambda表达式表示;
- 只有一个抽象方法的接口
- 情景上下文的推导
2.重写方法体里面大括号的语句
1.只能有一条语句
2. 必须是调用方法的语句
3. 重写方法的参数必须传入到调用方法的参数里
语法 :
(比如有个Person类)
简单总结了一下,可能和官方不太一样
1. 类名::方法名;
Person::getName
2. 对象::方法名;
new Person()::getName
3. 类名::new ||数组名::new
Person::new || String[]::new
举例:
1.String str= "abcDeF";比较字符串中小写字母的个数;
str.chars().filter(c->c>='a'&&c<='z').count();
等价于:
str.chars().filter(c->Character.isLowerCase(c)).count();
等价于:
str.chars().filter(Character::isLowerCase).count();
2. System.out返回一个printStream对象
List.of("a", "b", "c", "d").forEach(s -> System.out.println(s));
等价于:
List.of("a", "b", "c", "d").forEach(System.out::println);
Stream.of("a", "b", "c", "d").toArray(
new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
}
);
等价于:
Stream.of("a", "b", "c", "d").toArray(s->new String[s]);
等价于:
Stream.of("a", "b", "c", "d").toArray(String[]::new);