栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK8新特性之Lambda表达式方法引用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK8新特性之Lambda表达式方法引用

一、为什么要用方法引用

在使用Lambda表达式的时候,也会出现代码冗余的情况,比如:用Lambda表达式求一个数组的和

public static void main(String[] args) {
    printSum(a -> {
        // Lambda表达式中的代码和 getTotal中的代码冗余了
        int sum = 0;
        for (int i : a) {
            sum += i;
        }
        System.out.println("数组之和:" + sum);
    });
}

public static void getTotal(int[] a) {
    int sum = 0;
    for (int i : a) {
        sum += i;
    }
    System.out.println("数组之和:" + sum);
}

private static void printSum(Consumer consumer) {
    int[] a = {10, 20, 30, 40, 50, 60};
    consumer.accept(a);
}

因为在Lambda表达式中要执行的代码和我们另一个方法中的代码是一样的,这时就没有必要重写一份逻辑了,这时我们就可以“引用”重复代码

public static void main(String[] args) {
    printSum(a -> {
        printSum(Main::getTotal);
    });
}

public static void getTotal(int[] a) {
    int sum = 0;
    for (int i : a) {
        sum += i;
    }
    System.out.println("数组之和:" + sum);
}

private static void printSum(Consumer consumer) {
    int[] a = {10, 20, 30, 40, 50, 60};
    consumer.accept(a);
}
二、方法引用的五种方式 ①、对象名::方法名

这是最常见的一种用法。如果一个类中的已经存在了一个成员方法,则可以通过对象名引用成员方法

public static void main(String[] args) {
    Date now = new Date();
    Supplier supplier = () -> {
        return now.getTime();
    };
    System.out.println(supplier.get());
    // 然后我们通过 方法引用 的方式来处理
    Supplier supplier1 = now::getTime;
    System.out.println(supplier1.get());
}
②、类名::静态方法名
public static void main(String[] args) {
    Supplier supplier1 = ()->{
        return System.currentTimeMillis();
    };
    System.out.println(supplier1.get());
    // 通过 方法引用 来实现
    Supplier supplier2 = System::currentTimeMillis;
    System.out.println(supplier2.get());
}
③、类名::引用实例方法

Java面向对象中,类名只能调用静态方法,类名引用实例方法是用前提的,实际上是拿第一个参数作 为方法的调用者

public static void main(String[] args) {
    Function function = (s) -> {
        return s.length();
    };
    System.out.println(function.apply("hello"));
    // 通过方法引用来实现
    Function function1 = String::length;
    System.out.println(function1.apply("hahahaha"));
    BiFunction function2 = String::substring;
    String msg = function2.apply("HelloWorld", 3);
    System.out.println(msg);
}
④、类名::构造器

Java面向对象中,类名只能调用静态方法,类名引用实例方法是用前提的,实际上是拿第一个参数作 为方法的调用者

public static void main(String[] args) {
    Supplier sup = ()->{return new Person();};
    System.out.println(sup.get());
    // 然后通过 方法引用来实现
    Supplier sup1 = Person::new;
    System.out.println(sup1.get());
    BiFunction function = Person::new;
    System.out.println(function.apply("张三",22));
}
⑤、数组::构造器
public static void main(String[] args) {
    Supplier sup = () -> {
        return new Person();
    };
    System.out.println(sup.get());
    // 然后通过 方法引用来实现
    Supplier sup1 = Person::new;
    System.out.println(sup1.get());
    BiFunction function = Person::new;
    System.out.println(function.apply("张三", 22));
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/276537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号