事半功倍:Java 8 Lambda 表达式

使用 lambda 表达式可以使 Java 代码更易于阅读、更强大、更易读。

对编程语言的批评之一是为执行特定处理而编写的指令数量,有时您必须编写大量代码。Lambda 表达式在少数情况下解决了这个问题,并使 Java 更强大、更容易,就像 C# 多年来一直如此。

Lambda 表达式是 Java SE 8 中的新功能,这些是此版本中添加的最值得注意的功能。Lambda 表达式提供了一种更清晰的方式来表示使用这些表达式的方法和接口。Lambda 表达式还可以通过更轻松地浏览列表、筛选和从集合中提取数据来改进 Java 对象集合。性能特性在所有新的现代计算机上都提供了多任务环境中的 Java 增强。

程序员担心 lambda 表达式会用函数式编程的概念污染 Java 的面向对象性质。事实上,这些都是几年前影响 C# 语言的批评,但它已经比以前更好了。

C# 中的 Lambda 和 LINQ 表达式以及 VisualBasic.Net

Lambda 表达式已添加到 C# 和 VB.Net 中,主要是为了支持 LINQ(语言集成查询)。Lambda 表达式是匿名函数,可用于创建类似树的表达式。在 C# 中,您可以通过在侧面 lambda 运算符 => 的左侧,并将表达式或指令块放在另一侧。例如,表达式 x=>x*x 指定一个名为 x 的参数,并返回 x 的平方 VB.Net。在本例中,您可以使用匿名函数创建 lambda.

LINQ 是一组功能,也是在 Visual Studio 2008 中引入的,允许添加创建查询的功能。LINQ 可用于查询 SQL 数据库、XML 文档、ADO.Net 数据集和 .Net 集合、文件、字符串等。

LINQ 和 lambda 表达式在 C# 社区中变得很流行。因此,Java.

Java 中的匿名内部类

Java 中的匿名内部类是迈向 lambda 表达式的第一步。您可以通过调用内部类来使用它们,如以下示例所示:

JButton button = new JButton(test”);
button.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent e){
System.out.println(一键”);
}
});
内部类 操作侦听器 添加到按钮中的是一个内部类,其中包含一个方法 actionPerformed()。这为我们节省了一些代码,但不是太多。

在 java 8 中,只定义一种方法的接口称为函数接口。Lambda 表达式通常与函数接口和内部类一起使用。

Java

Java 中的 lambda 运算符为 ->。与 C# 一样,Java 8 附加参数,如以下示例所示:

(int x) ->x * x
我们声明了一个变量 x 的整数类型,我们想返回这个变量的平方 x.

让我们考虑这三个 lambda 表达式:

(int x, int y) ->x + y 

() ->36

(字符串 s) ->{ System.out.println(s);
现在考虑示例 ActionListener previous with lambda:

JButton button = new JButton(test”);
testButton.addActionListener(e ->System.out.println(一键”));
很明显,这段代码更小,可读性更强。我们还注意到内部类 ActionListener 变成了参数 e.

java.util.function

java.util.function 是在 Java 8 中添加的,包含五种类型的函数接口:
  • Predicate:作为参数传递的对象的属性。
  • Consumer:应以传递的对象作为参数触发的操作。
  • Function:呈现单个结果 Y: X->Y
  • Provider:包含 X-> 的 X
  • Unary Operator: 的实例x
  • (X, X)->的二进制运算符x

Java 8

Lambda 表达式中的对象集合可以改进 Java 中集合的使用。在不同的版本中,已将功能添加到集合中,这些功能与 lambda 表达式很好地结合在一起,例如 forEach 在两个接口上设置 IteratorIterable.

Example:
我们想要定义一个 List包含学生列表,该类的属性是学生的年龄.

List 和 = Student.createShortList();
现在我们可以定义一个谓词,以便能够从 List.

Predicate list = 和 ->et.getAge() >= 20;
最后,我们可以对我们的选择做一些事情:

aClass.doqlqthing(pl, list);
这比以前的 Java 版本快得多。如果你想做一个更复杂的过程,使用 forEach()

et.forEach( e -> e.getName() );
总而言之,添加到 Java 语言中的特性不会以任何方式削弱其面向对象的概念。这些特性将使语言强大、丰富和优雅。

References: