java8 中静态方法的双冒号引用示例。
首先我们创建一个函数式接口
@FunctionalInterface
public interface ArrayInterface {
public abstract int maxValue(int[] arr);
}
其次,静态方法一般都是工具类中用,我们写一个获取数组最大值的方法。
/**
* 工具类中定义静态方法
*/
public class ArrayUtils {
//定义一个方法返回数组的最大值
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
}
return max;
}
}
然后我们开始一步步优化,具体的流程如下:
/**
* 方法的引用
* 静态方法的引用 : 通过类名引用静态方法来简化Lamdba表达式
* 静态方法的引用格式:类名::静态方法名
*
* lamdba表达式使用的前提,必须有函数式接口
*/
public class LamdbaExperss01 {
public static void main(String[] args) {
//定义整型数组,调用工具类的静态方法获得数组的最大值
int[] arr = {1,33,5,7,9,13,25};
//第一种 使用匿名内部类
ArrayInterface a01 = new ArrayInterface() {
@Override
public int maxValue(int[] arr) {
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
}
return max;
}
};
//调用a01对象的方法获得数组的最大值
int maxValue01 = a01.maxValue(arr);
System.out.println(maxValue01);
//升级版 第二种 用Lamdba表达式简化 匿名内部类
ArrayInterface a02 = (int[] arr02)->{
int max = arr02[0];
for (int i = 0; i < arr02.length; i++) {
if (arr02[i] > max){
max = arr02[i];
}
}
return max;
};
int maxValue02 = a02.maxValue(arr);
System.out.println(maxValue02);
//再升级版 第三种 在上面lamdba表达式中调用工具类的方法求数组的最大值
ArrayInterface a03 = (int[] arr03)->{
int max03 = ArrayUtils.getMax(arr03);
return max03;
};
// 第三种简化后 第一版
ArrayInterface a04 = (int[] arr03)->{ return ArrayUtils.getMax(arr03); };
// 第三种简化后 第二版
/**
* 参考我之前写的lamdba表达式可省略的笔记
* ①参数列表有且只有一个参数,则可以省略小括号
* ②参数列表的数据类型可以省略,随时都可以省略
* ③当方法体有且只有一条语句的时候,可以省略大括号,如果省略了大括号,则return语句后分号也需要省略。
*/
ArrayInterface a05 = arr05-> ArrayUtils.getMax(arr05);
//第三种简化后 第三版
/**
* 方法引用可用的前提:
* ①有Lamdba表达式
* ②在Lamdba表达式中仅仅调用一个已经存在的方法
*/
ArrayInterface a06 = ArrayUtils::getMax;
int maxValue06 = a06.maxValue(arr);
System.out.println(maxValue06);
}
}
最后的输出结果都一样:
33
33
33