Java8 静态方法引用-双冒号::

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

Guess you like

Origin blog.csdn.net/LB_Captain/article/details/121525264