Lambda表达式与方法引用

lambda表达式

前提条件

使用Lambda表达式前提条件是:实现的接口是一个函数式接口

函数式接口

函数式接口就是在接口中只能有一个抽象方法。

Java 8 中还有一个注解@FunctionalInterface,表明接口是函数式接口。当然,不标注此注解,他也是函数式接口,注解只是起到编译检查的作用

java 8 提供了四大函数式接口:Consumer,Supplier,Function<T, R>,Predicate。
Lambda表达式与方法引用

语法

		// 这个接口中的accept方法负责接受一个参数,不作返回
		Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("输出内容");

等同于

		// Consumer<String> consumer = (s) -> {
		//	System.out.println(s);
		// };
		// 等同于下面的写法
		Consumer<String> consumer = s -> System.out.println(s);

        consumer.accept("输出内容");

这里可以看出,Lambda表达式充当了对象的身份。
在Lamdba中

  • -> 称作 Lambda操作符或箭头操作符
  • -> 左边的是方法的参数
    如果参数只有一个则可以省略小括号()
  • -> 右边的是接口中被重写的方法的方法体
    如果方法体中,只有一条语句,则可以省略大括号{ }
    如果方法体中,只有一条语句,且是返回语句,则可以省略return

方法引用

方法引用其实就是Lambda表达式特殊情况下的简写

使用条件

首先,使用方法引用前提是他能使用Lambda表达式,也就是函数式接口。第二点,实现接口的抽象方法的参数列表和返回值类型,必须于方法引用的方法的参数列表和返回值类型相同。(多数情况)

使用场景

三种情况:

  1. 对象::实例方法名
  2. 类::静态方法名
  3. 类::实例方法名

对于情况1,2,需要满足上述使用条件。对于情况3,需要满足参数中的第一个参数作为实例方法的调用者,而第二个参数是实例方法的参数。
举例:

  1. 对象::实例方法名
		// 对象::实例方法名,等同于上述Lambda表达式例子
		Consumer<String> consumer = System.out::println;
        consumer.accept("输出内容");
  1. 类::静态方法名、
		Comparator<Integer> comparator1 = new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                // 类的静态方法
                return Integer.compare(o1,o2);
            }
        };
        //Lambda表达式写法
        Comparator<Integer> comparator2 = (o1,o2) -> Integer.compare(o1,o2);
        // 方法引用写法
        Comparator<Integer> comparator3 = Integer::compareTo;
  1. 类::实例方法名
		Comparator<String> comparator1 = new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        };
        //Lambda表达式写法
        Comparator<String> comparator2 = (o1,o2) -> o1.compareTo(o2);
        // 方法引用,类的实例方法写法
        Comparator<String> comparator3 = String::compareTo;

在Lambda表达式中,o1作为Lambda体中方法的调用者,而o2是方法的参数,即使他们的参数类型、返回值类型不同,仍然可以使用方法引用写法。

构造器引用和数组引用

构造器引用其实和方法引用差不多,将构造方法当成一个方法而已,而数组引用也只是将数组当成了一种类型。
构造器引用:

		Function<String,MyClass> function1 = str -> new MyClass(str);

        Function<String,MyClass> function2 = str -> MyClass::new;

数组引用:

        Function<Integer,Integer[]> function3 = n -> new Integer[n];
        
        Function<Integer,Integer[]> function4 = Integer[]::new;
上一篇:softmax回归理论


下一篇:找出二叉树两节点的最低公共祖先节点