一,适用场景:
- 1,接口有且只有一个抽象方法;
- 2,方法的入参中有参数为接口的实例
此时在调用该方法时就可以使用lambda表达式了
二,使用
1,先来个简单例子
/**
* @description:
* @author: kismet
* @create: 2018-11-30 15:45
*/
public class Test {
//接口
public interface MyInterface {
//1,只能有一个抽象方法
void method(); //无参数无返回
}
/**
* Title: lambdaMethod Description: 调用lambda接口的方法
*
* @param myInterface 接口MyInterface的实例
* @return
* @author kismet
* @date 2018/11/30 16:06
*/
public static void lambdaMethod(MyInterface myInterface) {//2:有参数为,接口的实例
//TODO 业务
System.out.println("调用接口实现方法前");
myInterface.method();
System.out.println("调用接口实现方法后");
//TODO 业务
}
public static void main(String[] args) {
//java8之前方式
lambdaMethod(new MyInterface() {
@Override
public void method() {
System.out.println("接口方法实现:无参数");
}
});
//lambda表达式方式
lambdaMethod(() -> System.out.println("接口方法实现:无参数"));
}
}
说明:
- 1,由于为了直观显示,直接将接口定义在类里面了;
- 2,运行结果
调用接口实现方法前
接口方法实现:无参数
调用接口实现方法后
调用接口实现方法前
接口方法实现:无参数
调用接口实现方法后
2,再来看看有参数,有返回的
/**
* @description:
* @author: kismet
* @create: 2018-11-30 15:45
*/
public class Test4Param {
//接口
public interface MyInterface {
//1,只能有一个抽象方法
int method(String str); //有参数,有返回
}
/**
* Title: lambdaMethod Description: 调用lambda接口的方法
*
* @param myInterface 接口MyInterface的实例
* @param str
* @return
* @author kismet
* @date 2018/11/30 16:06
*/
public static void lambdaMethod(String str, MyInterface myInterface) {//2:有参数为,接口的实例
//TODO 业务
System.out.println("调用接口实现方法前");
int length = myInterface.method(str);
System.out.println("字符串的长度为==>" + length);
System.out.println("调用接口实现方法后");
//TODO 业务
}
public static void main(String[] args) {
//java8之前方式
lambdaMethod("求字符串长度", new MyInterface() {
@Override
public int method(String str) {
return str.length();
}
});
//lambda表达式方式
lambdaMethod("lambda求字符串长度", x -> x.length());
}
}
说明:可以看出有无参数或者返回区别在于lambda表达式的书写形式上;我们来看看lambda的主要几种书写形式
-
- 不需要参数,返回值为 5
() -> 5
- 不需要参数,返回值为 5
-
- 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
- 接收一个参数(数字类型),返回其2倍的值
-
- 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
- 接受2个参数(数字),并返回他们的差值
-
- 接收2个int型整数,返回他们的和(参数类型其实也可以省略)
(int x, int y) -> x + y
- 接收2个int型整数,返回他们的和(参数类型其实也可以省略)
-
- 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
- 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
-
- 多行时使用{};在返回值前面加上return就行
() -> {
int i = 3 + 5;
return i;
}
- 多行时使用{};在返回值前面加上return就行
3,lambda双冒号::的使用
List<String> strings = new ArrayList<>();
strings.add("1");
strings.add("12");
strings.add("123");
strings.forEach(System.out::println);//2,表示调用System.out的println方法
strings.forEach(String::length);//1,表示调用String的length方法
双冒号XX::yy表示调用XX的的yy方法,如上所示有两种情况
- 1>当yy为无参方法时,表示循环调用集合中每个XX实例的yy()方法;
如上面代码中表示循环调用集合中每个String实例的length()方法; - 2>当yy为有参方法时,表示调用XX的有参方法yy(XX,xx);并且参数类型为XX,这样就把集合中的每个XX作为yy方法的入参;
如上面代码中表示循环调用System.out的println方法,并且入参为集合中的每个String实例;