- 在Java中lambda用于简化一些匿名内部类的书写,而双冒号则用来简化lambda的书写,如果lambda方法体中仅调用了其他方法,可以用双冒号来简化lambda的书写。
- 语法规则:
类名::方法名
表示调用了类中了某个方法。 - lambda方法体中调用的方法可以是静态方法、实例方法以及构造方法,三者均可以通过双冒号进行简化。
- lambda中调用的方法参数和返回值必须和重写方法的参数和返回值相同。
下面来具体看个lambda方法体中调用静态方法的例子。
public class LambdaTest {
public void get(){}
public static List<Integer> filter(int[] num){
List<Integer> ans = new ArrayList<>();
for(int i = 0;i < num.length;i++){
if(num[i] > 5){
ans.add(num[i]);
}
}
return ans;
}
public static void main(String[] args){
// 匿名内部类写法
Info info = new Info() {
@Override
public List<Integer> method(int[] num) {
return filter(num);
}
};
// lambda写法
Info info2 = (int[] num)->{
return filter(num);
};
// lambda简化写法
Info info3 = num->filter(num);
// 双冒号简化lambda写法:在lambda方法体中又调用了其他方法,就可以使用双冒号将其进行简化
Info info4 = LambdaTest::filter;
System.out.println(info.method(new int[]{1, 2, 5, 6, 9}));
System.out.println(info2.method(new int[]{1, 2, 5, 6, 9}));
System.out.println(info3.method(new int[]{1, 2, 5, 6, 9}));
System.out.println(info4.method(new int[]{1, 2, 5, 6, 9}));
}
}
interface Info{
List<Integer> method(int[] num);
}
再看一个lambda方法体中调用构造方法的例子。
public class LambdaTest {
public static void main(String[] args){
// 匿名内部类写法
Info info = new Info() {
@Override
public Integer method(String num) {
return new Integer(num);
}
};
// lambda写法
Info info2 = (String num)->{
return new Integer(num);
};
// lambda简化写法
Info info3 = num -> new Integer(num);
// 双冒号简化lambda写法:在lambda方法体中又调用了其他方法,就可以使用双冒号将其进行简化
Info info4 = Integer::new;
System.out.println(info.method("123"));
System.out.println(info2.method("123"));
System.out.println(info3.method("123"));
System.out.println(info4.method("123"));
}
}
interface Info{
Integer method(String num);
}