java 匿名函数知识点有哪些?

关注者
2
被浏览
627
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

匿名函数 用来替代匿名类,匿名函数更加简约,可以简化编程,用于实现函数式接口。

JDK在不断升级的过程中,致力于解决的问题之一是让程序代码变得更加简洁。匿名类在某些场合能够简化程序代码。但是匿名类本身的代码看起来还是有点繁琐。从JDK8开始引入了Lambda表达式,在简化程序代码方面大显身手,它用简明扼要的语法来指定一段操作代码。

Lambda表达式的基本语法为:

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
  statment1;
  statment2;
  return statmentM;  
}

从Lambda表达式的基本语法可以看出,Lambda表达式可以理解为一段带有输入参数的可执行代码块,这种语法表达方式也可称之为函数式表达式。

Lambda表达式的一个重要用武之地是代替一些实现了特定接口的匿名类。在例程1的LambdaSample类中,用三种方式创建了实现了Runnable接口的实例。其中方式二和方式三使用了Lambda表达式。

例程1 LambdaSample.java

public class LambdaSample {
  public static void main(String[] args) {
    //方式一:使用匿名内部类
    Runnable r1 = new Runnable(){  
      public void run() {  System.out.println("Hello");}  
    new Thread(r1).start();  
    //方式二:使用Lambda表达式
    Runnable r2 = ()-> System.out.println("Hello");  
    new Thread(r2).start();  
    //方式三:使用Lambda表达式
    new Thread(()->System.out.println("Hello")).start();  
}

方式二和方式三都使用了Lambda表达式:

()-> System.out.println("Hello")

以上Lambda表达式相当于创建了实现Runnable接口的匿名类的实例,由于Runnable接口的run()方法不带参数,因此,Lambda表达式的参数列表也相应为空“()”,Lambda表达式中符号“->”后面的可执行语句块相当于run()方法的方法体。

尽管在Lambda表达式中并没有显式指定所实现的接口,但Java虚拟机会根据Lambda表达式所处的上下文,来识别所实现的接口。例如当Lambda表达式作为Thread类的构造方法的参数时,由于该参数是Runnable接口类型,因此Lambda表达式就会实现这一接口。

如果Lambda表达式的方法体包含多行语句,需要放在大括号{}内,例如:

Runnable r = ()-> {
      System.out.println("Hello");
      System.out.println("World");
    };

例程2先定义了一个Calculator接口,接下来在LambdaUser类的main()方法中,用Lambda表达式创建了实现Calculator接口的匿名类的实例。

例程2 Calculator接口和LambdaUser类

interface Calculator{
  public int calculate(int a,int b);            //进行某种计算
public class LambdaUser{
  public static void main(String[] args){
    Calculator c1=(a,b)->a/b+a;