Lambda表达式
Lambda表达式由数学中的λ演算得名,对应其中的Lambda抽象。在计算机编程中,很多语言都有Lambda表达式语法。Java8也引入了Lambda表达式语法,我们可以将其理解为一个匿名函数对象,其中包含了可以被调用执行的函数逻辑,但这段逻辑本身可以作为参数进行传递。使用Lambda表达式能让我们的代码更简洁、紧凑,提升代码的表达能力和可读性。
Lambda表达式使用例子
在Java8之前,实现类似“匿名函数”的效果需要创建匿名内部类,下面例子使用Runnable
接口创建了一个匿名内部类,用于Thread
类创建线程的执行逻辑。
package com.gacfox.demo;
public class Main {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello, world!");
}
}).start();
}
}
我们可以看到代码其实还是比较啰嗦的,下面我们使用Java8的Lambda表达式重写这个逻辑。
package com.gacfox.demo;
public class Main {
public static void main(String[] args) {
new Thread(() -> System.out.println("Hello, world!")).start();
}
}
代码一下子就简洁了很多,而且可读性也变高了。
Lambda表达式使用->
操作符表达,左侧指定了Lambda表达式所需的参数(上面例子中没有参数),右侧指定了Lambda表达式具体的执行逻辑。
Lambda表达式语法
下面我们从几个例子入手,介绍Java8中Lambda表达式的完整语法。
BinaryOperator<Integer> func = (Integer x, Integer y) -> {
System.out.println("开始执行计算");
return x + y;
};
上面是一个完整的Lambda表达式,->
操作符左侧为参数,使用小括号包裹;右侧为代码逻辑,使用大括号包裹。
BinaryOperator<Integer> func = (x, y) -> {
System.out.println("开始执行计算");
return x + y;
};
实际上,这里参数的类型完全可以省略不写,Lambda表达式的参数支持类型推断。
Consumer<String> func = (s) -> System.out.println(s);
如果Lambda表达式的执行逻辑只有一行代码,我们可以省略外围的大括号。
Consumer<String> func = s -> System.out.println(s);
如果Lambda表达式的参数只有一个,我们也可以省略小括号。
Consumer<String> func = System.out::println;
上面展示了一种叫做“方法引用”的语法,可以进一步简化Lambda表达式。我们可以看到例子中,其实System.out.println()
方法和func
的逻辑是完全一样的,那么此时就可以使用方法引用赋予Lambda表达式。
Runnable r = () -> System.out.println("Hello, world");
如果Lambda表达式没有参数,则小括号不能省略。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。