美文网首页
Lambda表达式的用法

Lambda表达式的用法

作者: 夜阑w | 来源:发表于2019-03-05 19:08 被阅读0次

    一、简介

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。它允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

    二、Lambda的语法

    通常使用语法为:(argument) -> (body)

    1. Lambda 表达式可以具有零个,一个或多个参数。
      • 可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。例如(int a)(a)相同。
      • 参数用小括号括起来,用逗号分隔。例如 (a, b)(int a, int b)(String a, int b, float c)
      • 空括号用于表示一组空的参数。例如 () -> 42
      • 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如a -> return a*a
    2. Lambda 表达式的正文可以包含零条,一条或多条语句。
      • 如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式的返回值类型要与匿名函数的返回类型相同。
      • 如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号(代码块)中,且表达式的返回值类型要与匿名函数的返回类型相同。

    一个例子:

    public class lambdaTest {
      public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
        for (Integer n : list) {
          System.out.println(n);
        }
        // 使用 -> 的 Lambda 表达式
        list.forEach(n -> System.out.println(n));
      }
    }
    

    三、方法引用

    某些lambda表达式里面仅仅是执行一个方法调用。在这种情况下,不用lambda表达式,直接通过方法名称引用方法的形式可读性更高一些,这种形式就是方法引用,方法引用是一种更简洁易懂的lambda 表达式。
    一个例子:
    可以使用如下方式创建一个比较器:

    Comparator c = (Person p1, Person p2) -> p1.getAge().compareTo(p2.getAge());
    

    使用类型推断省略其类型,则为:

    Comparator c = (p1, p2) -> p1.getAge().compareTo(p2.getAge());
    

    使用方法引用的方式,则为:

    Comparator c = Comparator.comparing(Person::getAge);
    

    上面的例子也可以使用方法引用的方式:

    public class lambdaTest {
      public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
        // 使用 :: 的 Lambda 表达式
        list.forEach(System.out::println);
      }
    }
    

    四、Lambda 表达式和匿名类之间的区别

    • this 关键字。对于匿名类 this 关键字解析为匿名类,而对于 Lambda 表达式,this 关键字解析为包含写入 Lambda 的类。
    • 编译方式。Java 编译器编译 Lambda 表达式时,会将其转换为类的私有方法,再进行动态绑定。

    相关文章

      网友评论

          本文标题:Lambda表达式的用法

          本文链接:https://www.haomeiwen.com/subject/isaouqtx.html