Lambda表达式及方法引用小结

Lambda表达式及方法引用小结

Scroll Down

对于lambda表达式和方法引用这两者,其中lambda是早有接触,不过也就看了一眼,至于方法引用则是完全没遇到过。直到最近看某位大佬的开源项目才发现还有这种操作,然后赶紧查资料学习了一波,做做笔记。

Lambda:

1. Lambda简介:

是java8中的一种新特性,主要是简化代码的一种特殊写法,可以看做匿名方法,但是lambda表达式是和函数式接口绑定的,需要通过函数式接口回调使用,简少了很多不必要的代码,如必须去实现某个接口,例如Runnable接口。

函数式接口:

简而言之,只包含一个抽象方法的接口,主要就是将lambda表达式赋值给接口对象,其实也就做了个接口方法实现,而不用专门去编写接口实现类。Java 8 引入了 java.util.function 包,旨在创建一组完整的目标接口,使得我们一般情况下不需再定义自己的接口,是Lambda和方法引用的目标类型。
注意:在编写函数式接口时可以通过 @FunctionalInterface 注解来显式的规范接口为函数式接口。如果接口不满足要求则会报错。

2.Lambda的大致形式:

(参数)->{语句块}   //基本格式
//以下列举几个例子
(String str)->{System.out.println(str);};  
(str)->System.ou.println(str);  
new Thread(()->System.out.println("hello world!";)).start();  

总结:

  • Lambda表达式可有0个或多个参数。
  • Lambda表达式的参数个数为一个的时可以省略小括号()不写,没有参数则必须写。
  • ->可理解为表示一种传递,将括号的值传递至方法体。
  • 同上,当语句体也只有一条语句时,花括号{}也可以省略不写。
  • Lambda表达式的参数可以不声明类型,编译器会自动根据上下文进行类型推断。
  • Lambda表达式绑定的接口只能有且仅有一个抽象方法!
  • 注意,如果Lambda表达式有返回值,类型需要和对应的函数式接口相同或者兼容。

方法引用:

1. 方法引用简介:

方法引用的作用个人看来和lambda表达式差不多,或者说是lambda的某种简化,能在开发过程中相对而言更能减少很多不必要的代码,如相同的方法。如果我们需要写的lambda表达式是已有的方法,那我们就可以通过方法引用来进行方法的引用,而不用再写表达式或者实现接口啥的。

至于用处:能用上lambda表达式的地方,基本都能用,只要有我们需要的方法和抽象方法的参数列表以及返回方法能够匹配。

2. 方法引用的形式:

ClassName::menthodName;     //引用普通方法
instanceName::menthodName;   //引用实例方法
ClassName::staticMethodName;   //引用静态方法
ClassName::new;    //引用构造方法

方法引用的格式就如上几种:

  • 实例名::实例方法名
  • 类名::new
  • 类名::普通方法名或者静态方法名
//例子
class Test
{
  public void print(){Sys.out.println("haha");}
}
new Thread(Test::print).start();  //输出haha,引用了Test类的print方法。不用再写lambda表达式,直接使用已有的方法
Runnable run=Test::print;
run.run();   //同上面的例子,输出haha

class Test2
{
  public void print(String arg)
  {
     System.out.println(arg);
   }
}

interface Need
  {
    void say(String args);
}

Need need=Test2::print;
need.say("hello boy!");  //拿着已有的方法就用

总结:

  • 方法引用还是和函数式接口绑定的,相当于该接口的一个实现
  • 在使用方法引用时注意参数列表和返回值的类型匹配问题,即方法签名相匹配
  • 能使用lambda的地方就能使用方法引用