05. Lambda 表达式

408 阅读4分钟

Lambda 表达式

Lambda 表达式对于已经从事其他语言开发的程序员来说,其实并不算什么新的功能,只是针对java8 之前的java 语法方式进行一些改进, 并且提供了一些语法糖,在这个教程中,我会带领大家从认识lambda 表达式到熟练使用lambda 表达式

1. 什么是Lambda 表达式

简单的认为就是Lambda 表达式就是之前我们写的匿名函数,因为java 中的匿名函数都可以通过lambda 表达式进行替换. 匿名函数式一个没有名称和任何标识符的函数

表达式是以常量值形式给定的无名函数,并且准确的写在 需要它的地方,通常作为其他函数的参数

Lambda 表达式最重要的特性是它在外观的上下文中执行,因此,类似的lambda 表达式可以在任何其他上下文中以不通 的方式( 即逻辑是相同的,但是结果会因传递函数的参数不同而不同)

Lambda表达式 为面向对象程序设计上的函数编程提供了许多的好处,大多数的oop语言围绕的是类和对象发展的,这些语言都是一等公民,另一个重要的实体,即功能,则是处于次要的地位

在java中尤如此,因为函数不能存在于对象之外,函数本事在java中是没有意义的,除非这个函数和对象和实例有关系,

但是在函数式 编程中,我们可以定义函数,给他们提供了引用变量,并将他们作为方法参数的传递

2. Lambda 表达式语法

典型的表达式的语法是这样的:

(parameters) -> expression

例如, 给定的lambda 表达式接收两个参数并返回他们的加法

基于 x 和 y 的类型,表达式会根据上下文推断出他们到底值,如果参数和 Integer 匹配,并将两个数字相加,如果这两个 参数的类型 是 string 类型的,那么将是两个 x 和 y 的 拼接。

3. java8 中lambda 表达式的特性
  • 一个lambda 表达式可以有零个参数,一个或者是多个参数
  • 可以显式的声明参数的类型,也可以从上下文中推断参数的类型
  • 多个参数用用强制括号包括起来,并且用逗号进行分隔,空括号用域表示一组空的参数
  • 当只有一个参数时,如果其类型是推断出来的,则不强制使用括号
  • 表达式的主题可以包含零个,一个或者多个语句
  • 如果lambda 表达式的主体有单个语句的花括号,那么匿名函数的返回类型和主体表达式的返回类型是相同的,如果正文中有一个以上的语句,则必须用花括号括起来
4. java8 函数接口

单个抽象方法接口(SAM)并不是一个新的概念,这意味着只有一个方法接口,在java 中,我们已经有 很多这样的SAM 接口列子

在Java中,SAM 接口也是 被称为 函数接口,java8 中通过新的注释@functionalinterface 标记这些接口来强制执行单一职责规则,函数式接口中有且只有一个抽象函数,

例如,Runnable 接口

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

如果我们在这个接口中添加新的接口是不允许的,后果就是 编辑器编译出错

我们知道lambda 表达式是没有名称的匿名函数,他们大多数情况下是当做参数传递给函数的,在java 方法中,参数总是有一个类型,类型信息被查找来确定在方法重载甚至简单方法调用的情况下需要调用哪个方法

因此,基本上每一个lambda 表达式都必须可以转换为某中类型才能被接收为方法参数,转换lambda 表达式的类型总是函数接口的类型

功能型接口类型的两个很好的例子就是ConsumerBiConsuer接口

让我们用一个简单的例子来理解它

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("howtodoinjava");
    }
}).start();


在这个匿名函数中,我们可以看到runnable 是一个接口, run 方法是一个函数,并且不需要传递任何参数, 因此按照 lambda表达式的写法就是

new Thread(
    () ->   { 
              System.out.println("My Runnable"); 
            }
    ).start();
Java8 Lambda 表达式实例

我们现在列举一些代码实例,废话少说直接上代码实例,,,都是简单的代码,我就直接写代码了

实例1: 使用lambda 表达式 迭代list 并切对list 中的元素进行一些操作
List<String> pointList = new ArrayList();
 
pointList.add("1");
pointList.add("2");
 
pointList.forEach(p ->  { System.out.println(p); } );

实例2: 使用Lambda 表达式在java 中创建并启动一个Thread
new Thread(
    () -> System.out.println("My Runnable"); 
).start();

这是一些简单的实例,只是让大家了解Lambda 表达式