在Java中使用Lambda表达式的前提:需要是函数接口。
接口中只存在一个需要被实现的抽象方法。
注:即便该接口中存在默认方法与静态方法,与Object中也存在的抽象方法(如equal等),毕竟所有实现的子类肯定继承自Object,只要只存在一个需要被实现的方法就算函数接口。
附:JDK1.8新特性:接口中可以存在默认实现的方法(default修饰)与静态方法(必须有方法体)。
下面的接口也属于函数接口:
package interfaces;
@FunctionalInterface
public interface MyInterface {
/*
* JDK1.8 新特性:接口中可以存在默认实现的方法(default修饰)与静态方法(必须有方法体)。
*
*/
// 唯一要手动实现的方法
int compare(int a, int b);
// Object的方法,毕竟实现类都是Object的子类,都已经默认实现了equals方法
boolean equals(Object obj);
// Object的方法,毕竟实现类都是Object的子类,都已经默认实现了toString方法
String toString();
public static void a(){
System.out.println("我是接口中的静态方法a");
}
public static void b(){
System.out.println("我是接口中的静态方法b");
}
default void c(){
System.out.printf("我是接口中的默认方法c");
}
default void d(){
System.out.printf("我是接口中的默认方法d");
}
}
多个形参
参数类型可以省略,如果没有形参,小括号也可以省略
(s1, s2) -> {
return s1.compareTo(s2);
}
只有一行代码(可省略return与括号)
(s1, s2) -> s1.compareTo(s2)
方法引用也是java8的新特性之一, 可以直接引用已有Java类或对象的方法或构造器。方法引用与lambda表达式结合使用,可以进一步简化代码。简化前提:方法引用,是指如果某个方法签名和接口恰好一致,就可以直接传入方法引用。
附:除了方法名外,方法参数一致,返回类型相同,因此,我们说两者的方法签名一致,可以直接把方法名作为Lambda表达式传入。
使用前提