JAVA Lambda表达式、函数式接口

函数式接口:

Java当中使用Lambda表达式的前提是,必须有“函数式接口”

函数式接口:有且仅有一个抽象方法的接口,叫做函数式接口。

如何才能万无一失地检测一下当前接口是不是函数式接口呢?
用一个固定的格式写在public interface之前一行即可:

  • @FunctionalInterface
    public interface 函数式接口名{
    xxxx…
@FunctionalInterface
public interface Calculator {
	
	public abstract int sum(int a,int b);
	
}

主类:

public class Lambda {
	public static void main(String[] args) {
	
		//调用方法时,参数类型是函数式接口,所以Lambda可以推断出来是哪个接口
		calc( (int a,int b) -> {return a + b; } ); //30
		
		//除了传参,也可以通过赋值语句左侧的类型来进行Lambda上下文推断
		Calculator param = (int a,int b) -> {return a + b; };
		calc(param);
		
//		(int a,int b) -> {return a + b; }; //错误写法,没有上下文环境,Lambda无法推断是哪个函数式接口
	}
	
	public static void calc(Calculator cal) {
		int result = cal.sum(10, 20);
		System.out.println(result);
	}
}

这里的Lambda表达式:(a,b) -> a + b
calc方法需要一个Calculator接口类型的参数
Lambda表达式就充当了Calculator接口类型的参数

  • 1.Lambda表达式前面的小括号,其实就是接口抽象方法的小括号
    2.箭头代表拿着小括号的数据做什么事,是一个指向的动作。
    3.箭头后面就代表拿到了参数之后做什么事情
    4.Lambda表达式的语言本身就代表了怎么做这件事情,没有对象的概念在里面。

Lambda表达式要想使用,一定要有函数式接口的推断环境。
1.要么通过方法的参数类型来确定是哪个函数式接口
2.要么通过赋值操作来确定是哪个函数式接口

Lambda的格式就是为了将抽象方法的头翻译成为以下三点:
1.一些参数(方法参数)
2.一个箭头
3.一些代码(方法体)

  • 例如抽象方法:
    public abstract int sum(int a,int b);

  • 翻译成Lambda:
    (int a,int b) -> { return a + b;}

Lambda简写:

  • 接口
    注意,不管写不写@FunctionalInterface,只要是有且仅有一个抽象方法的接口,就是函数式接口
    @FunctionalInterface
public interface MyInterface {
	
	//作用,将参数++,然后返回结果
	public abstract int singlePlus(int num);

}
  • Lambda主类:
public class Calc {

	public static void main(String[] args) {
		calc((a, b) -> a - b);  // -10
		calc((a, b) -> a + b);  // 30
	}

	public static void calc(Calculator cal) {
		int result = cal.sum(10, 20);
		System.out.println(result);
	}
}

1.Lambda表达式中的参数类型可以不写
2.参数只有一个,参数小括号可以省略
3.如果语句只有一个,那么大括号和return也可以省略

public class LambdaSimple {
	public static void main(String[] args) {
		//标准格式:
		method( (int x) -> {return ++x;}  );
		
		//省略参数格式:
		method(  (x) -> {return ++x;} );
		
		//省略参数小括号:
		method(  x -> {return ++x;}    );
		
		//省略大括号和return关键字
		method(  x -> ++x    );
	}


	public static void method(MyInterface inter) {
		int result = inter.singlePlus(10);
		System.out.println(result);
	}

}
发布了98 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43472877/article/details/104154886