自学内容网 自学内容网

【Java】—— 函数式编程:Lambda表达式、方法引用

目录

一、什么是Lambda表达式?

二、Lambda表达式使用规则

1、参数类型可以全部省略

2、如果只有一个参数,参数类型省略的同时"()"也可以省略

3、如果方法体中只有一行代码,大括号{}可以省略,同时省略";",如果有return,也必须省略

三、方法引用

1、静态方法引用

2、实例方法引用

3、构造器引用


一、什么是Lambda表达式?

JDK 8开始新增的一种语法形式,可以替代匿名内部类对象,让程序更简洁。

注意:只能替代函数式接口(有且仅有一个抽象方法的接口)的匿名内部类!!

二、Lambda表达式使用规则

1、参数类型可以全部省略

A a1 = (m,n) -> {
            return m+n;
        };

2、如果只有一个参数,参数类型省略的同时"()"也可以省略

B b1 = c -> {
            System.out.println("省略()");
        } ;

3、如果方法体中只有一行代码,大括号{}可以省略,同时省略";",如果有return,也必须省略

        A a2 = (m,n) -> m+n;

三、方法引用

使用已经存在的方法,作为函数式接口中抽象方法的方法体。

//        匿名内部类写法
        calculateAndPrint(new Computer() {
            @Override
            public double pow(double x, double y) {
                return Math.pow(x, y);
            }
        });
//        lambda写法
        calculateAndPrint((double a,double b) -> {return Math.pow(a,b);});
//        lambda省略写法
        calculateAndPrint((a,b)->Math.pow(a,b));
//        方法引用写法
        calculateAndPrint(Math::pow);

方法引用有静态方法引用、实例方法引用、构造方法引用

1、静态方法引用

使用格式:

类名 :: 静态方法

使用场景:

某个Lambda表达式里只是调用一个静态方法,并且“→”前后参数的形式一致

//        匿名内部类写法
        calculateAndPrint(new Computer() {
            @Override
            public double pow(double x, double y) {
                return Math.pow(x, y);
            }
        });
//        lambda省略写法
        calculateAndPrint((a,b)->Math.pow(a,b));
//        方法引用写法
        calculateAndPrint(Math::pow);

2、实例方法引用

1)使用格式:

对象名 :: 实例方法

使用场景:

某个Lambda表达式里只是通过对象名称调用一个实例方法,并且“→”前后参数的形式一致

//    使用匿名内部类
        Arrays.sort(student, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });
//        使用lambda表达式
        Arrays.sort(student, (o1, o2) -> o1.getAge() - o2.getAge());
//        使用方法引用
        Arrays.sort(student, new StudentComputer()::subAge);

2)使用格式:

类名 :: 实例方法

使用场景:

某个Lambda表达式里只是通过对象名称调用一个实例方法,同时参数列表中的第一个参数就是调用实例方法的对象, 并且“→”前后剩余参数的形式一致

//        匿名内部类
        convertAndPrint(new Convert() {
            @Override
            public String convert(String source, String oldStr, String newStr) {
                return source.replace(oldStr,newStr);
            }
        }, "四月天行健", "四", "五");
//        lambda写法
        convertAndPrint(((source, oldStr, newStr) -> source.replace(oldStr,newStr)),"北京","北","南");
//        方法引用
        convertAndPrint(String::replace,"JavaEE","JavaEE","Harmony");

3、构造器引用

使用格式:

类名 :: new

使用场景:

某个Lambda表达式里只是在创建对象,并且“→”前后参数情况一致

//        匿名内部类
        createStringAndPrint(new StringFactory() {
            @Override
            public String createString(byte[] bytes) {
                return new String(bytes);
            }
        }, bys);
//        lambda
        createStringAndPrint(bytes -> new String(bytes),bys);
//        方法引用
        createStringAndPrint(String::new,bys);


原文地址:https://blog.csdn.net/Tir_zhang/article/details/143665454

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!