提交 77b6060d 编写于 作者: W wizardforcel

2020-06-23 22:06:01

上级 085ceaad
......@@ -10,17 +10,17 @@ Java Lambda 表达式是 Java 的一个重要的新功能,已在 Java 8 中引
### Lambda 表达式的语法
让我们讨论 Lambda Expression 的语法。
让我们讨论 Lambda 表达式的语法。
Lambda 表达式包含三个组件,一组参数,一个 Lambda 运算符和一个函数体。 这是三个组成部分
* **参数列表**:这里是参数,也可以为空或非空。
* **Lambda 表达式**: Lambda 表达式或箭头(->)用于分隔参数列表和函数体。
* **Lambda 表达式**: Lambda 表达式或箭头(`->`)用于分隔参数列表和函数体。
* **函数正文**:它包含 Lambda 表达式的函数语句。
输入参数在 lambda 运算符的左侧,而函数体在 lambda 运算符的右侧。 此 Lambda Expression 语法可减少将五行代码合并为一行的代码的庞大性。
输入参数在 lambda 运算符的左侧,而函数体在 lambda 运算符的右侧。 此 Lambda 表达式语法可减少将五行代码合并为一行的代码的庞大性。
参数列表-> function_body
参数列表`->`函数正文
### Lambda 表达的特征
......@@ -54,7 +54,7 @@ Lambda 表达式包含三个组件,一组参数,一个 Lambda 运算符和
(x, y) -> x+y;
```
上面编写的 Lambda 表达式表示给定两个整数 x,y,并返回另一个具有 x 和 y 之和的整数。
上面编写的 Lambda 表达式表示给定两个整数`x``y`,并返回另一个具有`x``y`之和的整数。
另一个
......@@ -66,7 +66,7 @@ Lambda 表达式包含三个组件,一组参数,一个 Lambda 运算符和
**前提条件**
要运行 Java Lambda Expression,必须满足以下条件。
要运行 Java Lambda 表达式,必须满足以下条件。
* Java 开发套件(JDK8)
* NetBeans 或 Eclipse
......@@ -123,11 +123,11 @@ interface SingleParameterInterface {
}
```
上面的示例显示了带有单个参数的 Lambda 表达式。 它以 5 作为输入,并返回 5 的平方,而没有任何 return 语句。 如上所述,如果只有一条语句,则无需指定 return 关键字。 编译器会自动返回该值。
上面的示例显示了带有单个参数的 Lambda 表达式。 它以 5 作为输入,并返回 5 的平方,而没有任何`return`语句。 如上所述,如果只有一条语句,则无需指定`return`关键字。 编译器会自动返回该值。
### 具有多个参数的 Java Lambda 表达式
让我们以包含多个参数的 Java Lambda Expression 为例。 创建一个新的 Java 类,并将其命名为 **MulipleParamater** 。 打开它,并在其中粘贴以下代码。
让我们以包含多个参数的 Java Lambda 表达式为例。 创建一个新的 Java 类,并将其命名为`MulipleParamater`。 打开它,并在其中粘贴以下代码。
```java
public class MulipleParamater {
......@@ -148,7 +148,7 @@ interface MulipleParamaterInterface {
}
```
上面的示例显示了具有多个参数的 Lambda 表达式。 它以 5 和 4 作为输入,并返回 sum 为 9。同样,它无需指定 return 关键字即可工作。
上面的示例显示了具有多个参数的 Lambda 表达式。 它以 5 和 4 作为输入,并返回`sum`为 9。同样,它无需指定`return`关键字即可工作。
### 事件监听器
......@@ -198,8 +198,6 @@ public class eListener {
}
```
上面编写的代码显示了 Java 中不使用 Lambda Expression 的事件侦听器的示例。 因此,您必须熟悉该代码。 使用了简单的 JButton,JFrame 和 JTextField。 当用户单击按钮时,文本字段将显示 Hello World 消息。 这是输出
![](data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E)
上面编写的代码显示了 Java 中不使用 Lambda 表达式的事件侦听器的示例。 因此,您必须熟悉该代码。 使用了简单的`JButton``,JFrame``JTextField`。 当用户单击按钮时,文本字段将显示 Hello World 消息。 这是输出
<noscript><img class="wp-image-12604 aligncenter" sizes="(max-width: 443px) 100vw, 443px" src="img/303dddce88f78b1ebf45d69030f6fe44.png" srcset="https://javabeginnerstutorial.com/wp-content/uploads/2018/02/word-image.jpeg 443w, https://javabeginnerstutorial.com/wp-content/uploads/2018/02/word-image-300x131.jpeg 300w"/><p><strong>具有 Lambda 表达式的事件监听器</strong></p><p>现在使用 Lambda Expression 检查事件侦听器。 转到 eclipse 并创建一个名为<strong> eListenerLambda 的新类。 </strong>打开并粘贴以下代码。</p><pre><code class="language-java">import javax.swing.JButton; //import for JButton class import javax.swing.JFrame; //import for JFrame class import javax.swing.JTextField; //import for JTextField public class eListenerLambda { //event listener class without Lambda Expressions static JTextField textfield; static JButton button; static JFrame frame; public static void main(String[] args) { textfield=new JTextField(); button=new JButton("click"); frame=new JFrame("Event Listener without using Lambda Expression"); //set positions of text field and button textfield.setBounds(50, 50,150,20); button.setBounds(80,100,70,30); // lambda expression implementing here. button.addActionListener(e-&gt; {textfield.setText("hello world");}); frame.add(textfield); frame.add(button); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); frame.setSize(300, 200); frame.setVisible(true); } }</code></pre><p>上面编写的代码显示了带有 Lambda Expression 的 Java 事件侦听器的示例。 如果我们将这两个代码进行比较,您将检查第一个示例中的动作侦听器代码是否包含三个语句,而使用 Lambda Expression 可以在一个语句中解决问题。 这两个代码的输出与上面显示的相同。</p><h3>使用 Lambda 表达式的比较器示例</h3><p>让我们再看看使用 Lambda Expression 作为比较器示例的另一段代码。 创建一个新类,并将其命名为<strong> Comparatorlambda </strong> .java。 打开它并粘贴以下代码。</p><pre><code class="language-java">import java.util.ArrayList; import java.util.Collections; import java.util.List; //account class holds the details of a bank account of customers like account number, name and account balance class Account{ int accountNumber; String name; float AccountBalance; public Account(int accountNumber, String name, float AccountBalance) { super(); this.accountNumber = accountNumber; this.name = name; this.AccountBalance = AccountBalance; } } //comparator class using Lambda Expressions public class Comparatorlambda{ public static void main(String[] args) { List&lt;Account&gt; list=new ArrayList&lt;Account&gt;(); //Adding account details in list list.add(new Account(00235,"Harry",25000)); list.add(new Account(11687,"Donald",30088)); list.add(new Account(27865,"Caristano",15078)); System.out.println("Sorting on the basis of account name..."); // implementing lambda expression Collections.sort(list,(p1,p2)-&gt;{ return p1.name.compareTo(p2.name); }); System.out.println("Account Number: Account Name: Account Balance:"); for(Account p:list){ System.out.println(p.accountNumber+" \t\t"+p.name+" \t\t"+p.AccountBalance); } } }</code></pre><p>此示例具有一个帐户类,其中包含名称,号码和帐户余额之类的帐户信息。 Lambda 表达式用于根据帐户名称对帐户进行比较和排序。 这是用于此目的的 Lambda 表达式。</p><pre><code class="language-java">Collections.sort(list,(p1,p2)-&gt;{return p1.name.compareTo(p2.name); });</code></pre><p>以下是此代码的输出</p><p><img class="wp-image-12605 aligncenter" data-lazy-src="https://javabeginnerstutorial.com/wp-content/uploads/2018/02/word-image-1-1.jpeg" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E"/></p><noscript><img class="wp-image-12605 aligncenter" src="img/b940eb92cb3455c80aefcc6635a9e212.png"/><h2><strong>结论</strong></h2><p>Lambda 表达式用于定义函数式接口的内联实现。 您在上面的示例中看到,Lambda Expressions 节省了我们的时间,并大大减少了代码语句。 它通过促进函数式编程为 Java 提供了强大的功能。 Java 的这一新功能改变了完整的编码方式,简化了开发过程,因为它利用了多核环境的并行功能。</p> </body> </html></noscript>
\ No newline at end of file
......@@ -20,7 +20,7 @@ clickMeButton.addActionListener(new ActionListener(){
});
```
是的,上面的代码向您展示了一个匿名内部类,该类仅用于实现 ActionListener 接口的唯一方法 actionPerformed(ActionEvent)。 而且这很笨拙—即使现代的 IDE 可以帮助您完成代码填充以填充方法的主体。
是的,上面的代码向您展示了一个匿名内部类,该类仅用于实现`ActionListener`接口的唯一方法`actionPerformed(ActionEvent)`。 而且这很笨拙—即使现代的 IDE 可以帮助您完成代码填充以填充方法的主体。
但是,使用 lambda 表达式,您可以像下面这样简单地实现此方法:
......@@ -37,7 +37,7 @@ Lambda 表达式具有以下语法:
parameters -> expression body
```
lambda 表达式的关键是->箭头符号。
lambda 表达式的关键是`->`箭头符号。
让我们看一个基本的例子:
......@@ -49,7 +49,7 @@ lambda 表达式的关键是->箭头符号。
* 如果仅需要一个参数,则括号在参数周围是可选的
* 参数的类型声明是可选的
* return 语句是可选的
* `return`语句是可选的
* 表达式主体周围的花括号是可选的—如果表达式主体包含单个语句
因为我们的简单表达式符合上述所有四个要点,所以我们可以像这样覆盖 lambda 表达式:
......@@ -62,9 +62,9 @@ x -> x * x;
## 函数式接口
Lambda 表达式可用于实现所谓的**函数式接口**的方法。 较新的接口可以带有注释@FunctionalInterface,以指示此接口是函数式接口-但是,每个接口都可以视为仅具有**一个抽象方法**的函数式接口。因此,即使接口没有被非正式地标记为 FunctionalInterface,也可以使用 lambda 表达式替换/实现 ActionListener 的 addActionListener
Lambda 表达式可用于实现所谓的**函数式接口**的方法。 较新的接口可以带有注释`@FunctionalInterface`,以指示此接口是函数式接口-但是,每个接口都可以视为仅具有**一个抽象方法**的函数式接口。因此,即使接口没有被非正式地标记为`FunctionalInterface`,也可以使用 lambda 表达式替换/实现`ActionListener``addActionListener`
默认方法不具有抽象性,因为它们具有实现。 如果接口在不提供实现的情况下覆盖了 java.lang.Object 的方法,则该实现也不会被视为抽象,因为该实现将继承 java.lang.Object 类的实现。 让我们来看一个例子:
默认方法不具有抽象性,因为它们具有实现。 如果接口在不提供实现的情况下覆盖了`java.lang.Object`的方法,则该实现也不会被视为抽象,因为该实现将继承`java.lang.Object`类的实现。 让我们来看一个例子:
```java
/**
......@@ -94,7 +94,7 @@ public interface ExampleFunctionalInterface {
}
```
即使我们不添加注释,上面的接口也是一个功能性接口。 现在,我们创建一个 lambda 并使用它。 请记住,我们的 lambda 必须仅实现 getName()函数,该函数不需要任何参数并返回 String
即使我们不添加注释,上面的接口也是一个函数式接口。 现在,我们创建一个 lambda 并使用它。 请记住,我们的 lambda 必须仅实现`getName()`函数,该函数不需要任何参数并返回`String`
```java
final ExampleFunctionalInterface example = () -> "GHajba"; // implements the getName() function
......@@ -109,13 +109,13 @@ Hello GHajba!
ChangeCalculator$$Lambda$1/[[email protected]](/cdn-cgi/l/email-protection)
```
如您所见,默认方法可以与实现的 lambda 一起正常工作,并且可以从 java.lang.Object 调用 toString,因为不存在 lambda 表达式中的直接实现。
如您所见,默认方法可以与实现的 lambda 一起正常工作,并且可以从`java.lang.Object`调用`toString`,因为不存在 lambda 表达式中的直接实现。
## 更多例子
了解了 lambda 表达式后,我们来看一些示例,在这些示例中我们可以使用它们来改进现有或新代码。
因为 lambda 表达式是匿名函数或内部类,所以我们可以用它们替换对现有匿名函数的调用。 就像 GUI 应用的动作监听器或 Runnable 接口的本地实现一样。
因为 lambda 表达式是匿名函数或内部类,所以我们可以用它们替换对现有匿名函数的调用。 就像 GUI 应用的动作监听器或`Runnable`接口的本地实现一样。
```java
final Runnable runnable = new Runnable() {
......@@ -129,24 +129,24 @@ final Runnable runnable = new Runnable() {
runnable.run();
```
上面的示例使用匿名类实现 Runnable 接口。 现在来看看这个简单的“你好 lambdas”吗? 输出这是要做的一些工作。
上面的示例使用匿名类实现`Runnable`接口。 现在来看看这个简单的“你好 lambdas”吗? 输出这是要做的一些工作。
```java
final Runnable runnable_lambdas = () -> System.out.println("Hello lambdas!");
runnable_lambdas.run();
```
上面的代码示例使用 lambda 表达式,并且做完全相同的事情:它输出字符串“ Hello lambdas!”。 到控制台-但是无需创建匿名类来实现 Runnable 接口。 自然,此代码仅适用于函数式接口(只有一种方法的接口)。
上面的代码示例使用 lambda 表达式,并且做完全相同的事情:它输出字符串“`Hello lambdas!`”。 到控制台-但是无需创建匿名类来实现`Runnable`接口。 自然,此代码仅适用于函数式接口(只有一种方法的接口)。
如您所见,也可以创建无参数的 lambda。 为此,您需要提供空括号作为参数,以表明没有任何内容。
除此之外,lambda 表达式也是闭包。 这意味着它们是可以保存在变量中并在以后重用的函数。 如果我们看一下上一节中的示例,我们可以将其保存到一个名为 square 的变量中,并在以后重用:
除此之外,lambda 表达式也是闭包。 这意味着它们是可以保存在变量中并在以后重用的函数。 如果我们看一下上一节中的示例,我们可以将其保存到一个名为`square`的变量中,并在以后重用:
```java
IntUnaryOperator square = x -> x * x;
```
要使用它,我们可以直接调用它,也可以在某些流表达式中使用它,例如 map
要使用它,我们可以直接调用它,也可以在某些流表达式中使用它,例如`map`
```java
System.out.println(square.applyAsInt(128));
......@@ -183,7 +183,7 @@ public static Function<Integer, Function<Integer, Integer>> multiply() {
}
```
这段代码创建了一个简单的函数,将两个 Integer 类型的变量相乘。 因为返回的函数需要两个参数(x 和 y),所以我们可以创建这些函数的当前版本并在以后使用它们:
这段代码创建了一个简单的函数,将两个`Integer`类型的变量相乘。 因为返回的函数需要两个参数(x 和 y),所以我们可以创建这些函数的当前版本并在以后使用它们:
```java
final Function<Integer, Integer> two_times = multiply().apply(2);
......@@ -197,7 +197,7 @@ System.out.println(two_times.apply(3)); // prints 6
System.out.println(three_times.apply(3)); // prints 9
```
每次自然地调用 apply()有点矫 kill 过正,但是 Java 目前无法使其变得更好。 如果可以编写以下代码,则将是更好的语法:
每次自然地调用`apply()`有点麻烦,但是 Java 目前无法使其变得更好。 如果可以编写以下代码,则将是更好的语法:
```java
final Function<Integer, Integer> two_times = multiply()(2)
......@@ -208,6 +208,6 @@ System.out.println(two_times(3));
## 结论
如果您要实现功能性接口而无需创建和实例化实现该接口的类,那么 Lambda 表达式功能强大-主要是因为您只需要一次(例如,用作按钮的 ActionListener)。
如果您要实现函数式接口而无需创建和实例化实现该接口的类,那么 Lambda 表达式功能强大-主要是因为您只需要一次(例如,用作按钮的`ActionListener`)。
我们研究了 currying /部分函数应用,并讨论了一些功能将使其更易于在 Java 中使用,并希望在将来的版本中我们可以使用它。
\ No newline at end of file
我们研究了珂里化/函数部分应用,并讨论了一些功能将使其更易于在 Java 中使用,并希望在将来的版本中我们可以使用它。
\ No newline at end of file
# Java 8 Lambda foreach 列表
# Java 8 Lambda 列表`foreach`
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-8-lambda-foreach-list/](https://javabeginnerstutorial.com/core-java-tutorial/java-8-lambda-foreach-list/)
您一定已经听说过 Java 8 中引入的 Lambda Expression。很快,我们将介绍有关它的详细主题。 但是现在在本文中,我将展示如何使用 Lambda 表达式来迭代 Collection List。 如果要遍历 Map,可以查看 [Java 8 lambda foreach Map](https://javabeginnerstutorial.com/core-java-tutorial/java-8-lambda-foreach-map/) 文章。
您一定已经听说过 Java 8 中引入的 Lambda 表达式。很快,我们将介绍有关它的详细主题。 但是现在在本文中,我将展示如何使用 Lambda 表达式来迭代`List`集合。 如果要遍历`Map`,可以查看 [Java 8 lambda 映射`foreach`](https://javabeginnerstutorial.com/core-java-tutorial/java-8-lambda-foreach-map/)文章。
### 清单 1:使用 for 循环进行迭代
### 清单 1:使用`for`循环进行迭代
```java
class java_forLoop_list {
......@@ -27,7 +27,7 @@ class java_forLoop_list {
}
```
### 清单 2:使用增强的 for Loop(Java 5)进行迭代
### 清单 2:使用增强的`for`循环(Java 5)进行迭代
```java
class java_5_enhancedForLoop_list {
......@@ -44,7 +44,7 @@ class java_5_enhancedForLoop_list {
}
```
### 清单 3:Java 8 Lambda forEach
### 清单 3:Java 8 Lambda `forEach`
```java
public class java_8_forEach_list {
......
# Java 8 Lambda foreach 映射
# Java 8 Lambda 映射`foreach`
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-8-lambda-foreach-map/](https://javabeginnerstutorial.com/core-java-tutorial/java-8-lambda-foreach-map/)
您一定已经听说过 Java 8 中引入的 Lambda Expression。很快,我们将介绍有关它的详细主题。 但是现在在本文中,我将展示如何使用 Lambda 表达式来迭代 Collection
您一定已经听说过 Java 8 中引入的 Lambda 表达式。很快,我们将介绍有关它的详细主题。 但是现在在本文中,我将展示如何使用 Lambda 表达式来迭代集合
### 在 Java 8 之前
......@@ -46,4 +46,4 @@ public class java_8_forEach_Map {
}
```
如您所见,通过单行代码,我们可以遍历 Map。 同样,我们可以使用 Lambda 中引入的过滤器过滤出结果。
\ No newline at end of file
如您所见,通过单行代码,我们可以遍历`Map`。 同样,我们可以使用 Lambda 中引入的过滤器过滤出结果。
\ No newline at end of file
......@@ -14,10 +14,10 @@ Java SE 9 于 2017 年 9 月发布。它包含一长串功能,包括模块化
1. JSR 376:Jigsaw 项目(Java 平台模块系统)下的 JDK 模块化
2. JEP 222:jshell:Java Shell(Java REPL)
3. JEP 295:提前编译
3. JEP 295:AOT 编译
4. JEP 268:XML 目录
5. JEP 266:更多并发更新。 它包括 Reactive Streams 的 Java 实现,包括一个新的 Flow 类,该类将包括 Reactive Streams 当前提供的接口。
6. JEP 193:变量句柄:建立标准方法来请求各种 java.util.concurrent.atomic 和 sun.misc.Unsafe 操作的等效项
5. JEP 266:更多并发更新。 它包括反应式流的 Java 实现,包括一个新的`Flow`类,该类将包括反应式流当前提供的接口。
6. JEP 193:变量句柄:建立标准方法来请求各种`java.util.concurrent.atomic``sun.misc.Unsafe`操作的等效项
7. JEP 282:jlink:Java 链接器:设计一种工具,该工具可以将一组模块及其主导结构构建和优化为自定义运行时映像。 它有效地允许产生完全正确的执行,包括运行它的 JVM。
8. JavaDB 已从 JDK 中删除
9. JEP 263:HiDPI 图形:自动缩放和调整大小
......@@ -28,7 +28,7 @@ Java 9 应该为千兆字节的堆提供更好的帮助,更好的本机代码
当前的编译器控制功能旨在提供对 JVM 编译器的细粒度和方法上下文相关的控制,使开发人员可以在运行时更改编译器控制选项,而不会降低执行质量。 该工具还简化了 JVM 编译器错误的解决方法。
Java 9 还忽略了 import 语句上的 Java 警告,以进一步编写大型代码库,而不再使用 lint 警告。 这些包含代码库的不推荐使用的功能通常必须保留一段时间,但是如果自愿使用了该不推荐使用的构造,则传达不推荐使用的构造并不能保证发出警告消息。
Java 9 还忽略了`import`语句上的 Java 警告,以进一步编写大型代码库,而不再使用 lint 警告。 这些包含代码库的不推荐使用的功能通常必须保留一段时间,但是如果自愿使用了该不推荐使用的构造,则传达不推荐使用的构造并不能保证发出警告消息。
Java 的有效发布措施意味着开发人员不必等待显着的[版本](https://javabeginnerstutorial.com/core-java-tutorial/java-9-features/)。 Java 工具供应商 ZeroTurnaround 的 Java 倡导总监西蒙·梅普尔(Simon Maple)说,这也可能意味着开发人员将跳过 Java 9 及其“天真的”模块化功能,而等待六个月才能获得现代版本,这可能会消除任何复杂性。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册