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老人。。。哭。。。。