自己理解:
- 就是将 -> 左边的部分当作形参传入 右边的匿名内部类,通过形参 得到内部类的运行结果
lambda表达式:
在Lambda表达式中,将其划分了几块。这一行就是lambda表达式。() -> System.out.println(“使用Lambda表达式”);下面我们对lambda的格式进行一个介绍:
(1)左边括号:lambda的形参列表,就好比是我们定义一个接口,里面有一个抽象方法,这个抽象方法的形参列表。
(2)箭头:lambda的操作符,所以你看见这个箭头心中知道这是一个lambda表达式就可以了。
(3)右边lambda体:就好比是我们实现了接口中的抽象方法。
- 当遇到::时,也是lambda的一种形式,
方法引用(::):
有时候,lambda体可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰。所以我们来总结:方法引用(::)是一个更加紧凑,易读的 Lambda 表达式,注意方法引用是一个 Lambda 表达式,其中方法引用的操作符是双冒号 “::”
我们可以通过自定义方法来模拟一下:
public class Test {
public static void main(String[] args) {
//传统的方式来实现MyFunction/得到一个实现接口的对象 可以使用
//匿名内部类
//MyFunction<Desk, String> hf = new MyFunction<Desk, String>() {
// @Override
// public String apply(Desk desk) {
// return "hello desk";
// }
//};
//String val = hf.apply(new Desk());
//System.out.println("val-" + val);
MyFunction<Desk,String> hf2 = Desk::getBrand;
String val2 = hf2.apply(new Desk());
System.out.println("val2-" + val2);//这里输出结果就是val2-北京牌
}
}
//定义一个函数式接口: 有且只有一个抽象方法的接口
//我们可以使用@FunctionalInterface 来标识一个函数式接口
//MyFunction是一个函数式接口 (是自定义泛型接口)
@FunctionalInterface
interface MyFunction<T, R> {
R apply(T t); //抽象方法: 表示根据类型T的参数,获取类型R的结果
//public void hi();
//函数式接口,依然可以有多个默认实现方法
default public void ok() {
System.out.println("ok");
}
}
@FunctionalInterface
interface MyInterface {
public void hi();
}
class Desk { //Bean
private String name = "my desk";
private String brand = "北京牌";
private Integer id = 10;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getBrand() {
return brand;
}
}