JAVA的Interface使用过很长。。很长时间。。长到很久没有看过Reference很久了。

        直到最近,机缘巧合看代码,发现JAVA居然也有类似JavaScript的Lambda表达式[->],以及类似C里面函数指针的东东,[::]。找来Google等等,一阵学习,大概备忘一下,个人感觉,代码行数是少了,但是可读性变差了(官方说法是可读性变好了),真是晕,难道我已经太习惯以前的使用方式了??!!

废话不多说,直接上例子。

首先一个接口,这个基本一样

public interface CustomFunction {
	public void exec();
}

先来 两种直到目前一直使用的方式

方式1,内部实现一个接口方法,然后使用

public class DemoMain0{
	public static void main(String[] args) {			
		CustomFunction method1 = new CustomFunction(){
			@Override
			public void exec() {
				// TODO Auto-generated method stub
				System.out.println("CustomFunction1 exec");
			}			
		};		
		method1.exec();	
	}		
}

方式2,直接 implements 接口,然后实现接口方法使用

public class DemoMain1 implements CustomFunction{

	public static void main(String[] args) {		
		DemoMain1 mDemoMain2 = new DemoMain1();		
		CustomFunction method1 = mDemoMain2;		
		method1.exec();		
	}	
	@Override
	public void exec() {
		System.out.println("CustomFunction3 exec");		
	}	
}

现在的新方式1 Lambda

public class DemoMain2 {
	public static void main(String[] args) {	
		CustomFunction method2 = () ->{
			System.out.println("CustomFunction2 exec");
		};		
		method2.exec();
	}	
}

现在的新方式2 两个冒号…

public class DemoMain3{
	public static void main(String[] args) {		
		CustomFunction method3 = DemoMain3::doSomething;			
		method3.exec();	
	}		
	public static void doSomething() {
		System.out.println("CustomFunction3 exec");
	}	
}

当然,参照官方的文档,具体使用方法上当然还有很多讲究,

比如双冒号的,对于静态方法使用ClassName::method,对于动态方法,则使用实例 objRef:method.

Lambda配合Function接口,BALABALA。。。有很多功能优势等等,然后强调一个上世纪50年代就出现的的编程概念[函数式编程]。最近很火的样子。。

但问题是。。。本来这些功能,原来的接口都支持的啊,为啥要搞一套这个东东出来,疑问啊疑问。。。

就是为了折腾我这样的JAVA老人。。。哭。。。。

最后修改日期: 2022年6月13日

作者