多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java Lambda 表达式教程 > 原文: [https://javatutorial.net/java-lambda-expressions-tutorial](https://javatutorial.net/java-lambda-expressions-tutorial) Java 8 引入了 Lambda 表达式,它是引入的最大(甚至不是最大)功能之一,因为 Lambda 表达式使功能编程成为可能,并且使您的代码更整洁,并从整体上极大地简化了整个代码的实现。 例如,当您必须使用匿名类并且该类非常简单(例如仅包含几个(或更少)方法)时,您会遇到非常不清楚且难以阅读/维护的语法。 这是 Lambda 表达式发挥作用的时候。 ![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg) ### 让我们比较一下使用 Lambda 表达式和不使用 Lambda 表达式 假设有一个类,该类具有默认情况下按升序对元素进行排序的方法(例如`Comparator`)。 此类使用`compare`来对元素进行排序。 让我们覆盖它。 ## 不使用 Lambda 表达式 ```java Comparator<Double> sorter = new Comparator<Double>() { @Override public int compare(Double x, Double y) { return y.compareTo(x); } }; ``` ## 使用 Lambda 表达式 ```java Comparator<Double> lambdaComparator = (x, y) -> y.compareTo(x); ``` 我相信您会注意到两种方法之间的区别。 两者都导致同一件事,这颠倒了该方法对元素进行排序的顺序(从升序到降序,对您的比较器开玩笑!)。 因此,仅通过查看此示例,使用 lambda 表达式的一个关键优势就是可以减少键入的代码。 对于我们懒惰的程序员来说,这是一个很好的例子。 但是,人们可能会争辩说,由于这种简单性,实际上使记住语法变得更加困难。 没错,这将是一个缺点。 最初,语法可能有点难以记住,但是一旦您记住它,就可以编写简洁的代码,该代码也允许您实现`Functional`接口。 让我们看看 Lambda 表达式的更多示例。 首先,如我之前所说,语法起初有点令人生畏。 如果您要“覆盖”的函数没有任何参数,则只需键入`() -> {body}`。 另一方面,如果只有一个参数,则键入`x -> {body}`。 对于两个或更多参数,您将具有`(x, y, z -> {body}`。 ## 循环播放 ```java import java.util.*; public class LambdaExpressionDemo { public static void main(String[] args) { List<int> listOfNumbers = new ArrayList<int>(); listOfNumbers.add(1); listOfNumbers.add(2); listOfNumbers.add(3); listOfNumbers.add(4); listOfNumbers.add(5); listOfNumbers.add(6); listOfNumbers.add(7); listOfNumbers.add(8); listOfNumbers.forEach( (num) -> System.out.println(num) ); } } ``` 注意,在`forEach`循环的主体中,我省略了`{}`花括号。 这是因为主体仅包含一行。 如果我有两行或更多行,假设另一个打印语句,那么我将拥有大括号,如下所示: ```java import java.util.*; public class LambdaExpressionDemo { public static void main(String[] args) { List<int> listOfNumbers = new ArrayList<int>(); listOfNumbers.add(1); listOfNumbers.add(2); listOfNumbers.add(3); listOfNumbers.add(4); listOfNumbers.add(5); listOfNumbers.add(6); listOfNumbers.add(7); listOfNumbers.add(8); listOfNumbers.forEach( (num) -> { System.out.println(num); System.out.println(num); ); } } ``` ## 从 Lambda 表达式返回值 您也可以像使用方法一样使用 lambda 表达式返回值。 这里要注意的一个关键是`return`关键字是可选的。 您可以忽略它,编译器知道它的工作。 语法类似于我们之前使用的语法。 ```java (x, y) -> { return x > y; } ``` 因此,如果我们再次查看 Lambda 表达式提供的内容,我们可以得出结论,它为我们提供了可选的类型声明(无需声明参数的类型),可选的花括号,可选的`return`关键字(因为编译器自动返回值) (如果主体具有返回值的符号表达式)和参数周围的可选括号。