提交 e0c4ef1f 编写于 作者: W wizardforcel

2019-10-07 17:48:32

上级 0f130b6d
......@@ -2,11 +2,11 @@
> 原文: [https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)
Lambda 表达式是 Java 8 中引入的一个新特性表达式是一个匿名函数。一个没有名称且不属于任何类的函数。 lambda 表达式的概念最初是在 LISP 编程语言中引入的。
Lambda 表达式是 Java 8 中引入的一个新特性。λ 表达式是一个匿名函数。一个没有名称且不属于任何类的函数。 lambda 表达式的概念最初是在 LISP 编程语言中引入的。
## Java Lambda 表达式语法
要创建 lambda 表达式,我们在 lambda 运算符的左侧指定输入参数(如果有的话) - >,并将表达式或语句块放在 lambda 运算符的右侧。例如,lambda 表达式(x,y) - > x + y 指定 lambda 表达式接受两个参数 x 和 y 并返回这些参数的总和。
要创建 lambda 表达式,我们在 lambda 运算符`->`的左侧指定输入参数(如果有的话),并将表达式或语句块放在 lambda 运算符的右侧。例如,lambda 表达式`(x, y) -> x + y`指定 lambda 表达式接受两个参数`x``y`并返回这些参数的总和。
```java
//Syntax of lambda expression
......@@ -25,21 +25,21 @@ Java 中的 lambda 表达式具有以下主要部分:
Lambda 表达式**仅具有主体和参数列表**
1\. **没有**名称 - 函数是匿名的,所以我们不关心名称
2.参数列表
3\. Body - 这是函数的主要部分。
3\. 正文 - 这是函数的主要部分。
4\. **没有**返回类型 - java 8 编译器能够通过检查代码来推断返回类型。你不必明确提及它。
## 在 Java 中使用 Lambdas 的位置
要使用 lambda 表达式,您需要创建自己的功能接口或使用 Java 提供的预定义功能接口。只有单个抽象方法的**接口称为功能接口(或单抽象方法接口),例如:Runnable,callable,ActionListener 等。**
要使用 lambda 表达式,您需要创建自己的函数式接口或使用 Java 提供的预定义函数式接口。只有单个抽象方法的接口称为函数式接口(或单抽象方法接口),例如:`Runnable``callable,ActionListener`等。
**使用功能接口:**
**使用函数式接口:**
Pre Java 8:我们创建匿名内部类。
Post Java 8:您可以使用 lambda 表达式而不是匿名内部类。
Java 8 之前:我们创建匿名内部类。
Java 8 之后:您可以使用 lambda 表达式而不是匿名内部类。
## Java Lambda 表达式示例
**不使用 Lambda 表达式:**在 java 8 之前,我们使用匿名内部 classe 来实现功能接口的唯一抽象方法。
**不使用 Lambda 表达式:**在 java 8 之前,我们使用匿名内部类来实现函数式接口的唯一抽象方法。
```java
import java.awt.*;
......
......@@ -2,8 +2,8 @@
> 原文: [https://beginnersbook.com/2017/10/method-references-in-java-8/](https://beginnersbook.com/2017/10/method-references-in-java-8/)
在上一个教程中,我们在 Java 8 中学习了 [lambda 表达式。这里我们将讨论 java 8 的另一个新特性,**方法引用**。方法引用是用于调用方法的 lambda 表达式的简写表示法。例如:
如果你的 lambda 表达式是这样的:](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)
在上一个教程中,我们在 Java 8 中学习了 [lambda 表达式](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)。这里我们将讨论 java 8 的另一个新特性,**方法引用**。方法引用是用于调用方法的 lambda 表达式的简写表示法。例如:
如果你的 lambda 表达式是这样的:
```java
str -> System.out.println(str)
......@@ -15,14 +15,14 @@ str -> System.out.println(str)
System.out::println
```
::运算符用于方法引用,以将类或对象与方法名称分开(我们将在示例的帮助下学习)。
`::`运算符用于方法引用,以将类或对象与方法名称分开(我们将在示例的帮助下学习)。
## 四种方法引用
1.对象的实例方法的方法引用 - object :: instanceMethod
2.对类的静态方法的方法引用 - 类:: staticMethod
3.对任意对象的实例方法的方法引用特定类型的类 - Class :: instanceMethod
4.对构造函数的方法引用 - Class :: new
1.对象的实例方法的方法引用 - `object::instanceMethod`
2.类的静态方法的方法引用 - `class::staticMethod`
3.特定类的任意对象的实例方法的方法引用 - `Class::instanceMethod`
4.构造函数的方法引用 - `Class::new`
## 1.方法引用:对象的实例方法
......@@ -106,7 +106,7 @@ Sansa
Steve
```
## 4.构造函数的方法引用
## 4.构造函数的方法引用
```java
@FunctionalInterface
......
# Java 函数接口
# Java 函数接口
> 原文: [https://beginnersbook.com/2017/10/java-functional-interfaces/](https://beginnersbook.com/2017/10/java-functional-interfaces/)
只有单个抽象方法的**接口称为函数接口。您可以使用 Java 提供的预定义函数接口,也可以创建自己的函数接口并使用它。您可以在这里检查预定义的函数接口:[预定义的函数接口](https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)它们都只有一个抽象方法。这就是原因,它们也被称为单抽象方法接口(SAM 接口)。**
只有单个抽象方法的**接口称为函数式接口。您可以使用 Java 提供的预定义函数式接口,也可以创建自己的函数式接口并使用它。您可以在这里检查预定义的函数式接口:[预定义的函数式接口](https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)它们都只有一个抽象方法。这就是原因,它们也被称为单抽象方法接口(SAM 接口)。**
要在 Java 中使用 [lambda 表达式,您需要创建自己的函数接口或使用 Java 提供的预定义函数接口。在创建自己的函数接口时,用 **@FunctionalInterface** 注释标记它,这个注释是在 Java 8 中引入的。尽管它是可选的,你应该使用它,这样如果你用这个标记的接口就会出现编译错误注释不遵循函数接口的规则。](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)
要在 Java 中使用 [lambda 表达式,您需要创建自己的函数式接口或使用 Java 提供的预定义函数式接口。在创建自己的函数式接口时,用`@FunctionalInterface`注解标记它,这个注解是在 Java 8 中引入的。尽管它是可选的,你应该使用它,这样如果你用这个标记的接口就会出现编译错误注解不遵循函数式接口的规则。](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)
## 定义函数接口的规则是什么?
## 定义函数接口的规则是什么?
函数接口应该有**只有一个**抽象方法。除了一个抽象方法,它们还可以包含任意数量的默认和静态方法。
函数接口应该有**只有一个**抽象方法。除了一个抽象方法,它们还可以包含任意数量的默认和静态方法。
## 示例 1:创建自己的函数接口
## 示例 1:创建自己的函数接口
```java
@FunctionalInterface
......@@ -35,7 +35,7 @@ Result: 112
```
## 示例 2:使用预定义的函数接口
## 示例 2:使用预定义的函数接口
```java
import java.util.function.IntBinaryOperator;
......@@ -58,10 +58,11 @@ Result: 112
```
## 函数接口示例:使用匿名内部类 vs 使用 lambda 表达式
## 函数接口示例:使用匿名内部类 vs 使用 lambda 表达式
**我们在 java8** 之前就已经使用了函数接口,它们是通过使用这些接口创建匿名内部类来使用的。你必须已经看过像 Runnable,ActionListener,Comparator 等函数接口。它们都有单一的抽象方法。让我们看一个 ActionListener 的例子,看看它如何与 Anonymous 内部类一起使用,以及如何使用 lambda 表达式实现它。
**ActionListener 示例:在 Java 8 之前:使用匿名内部类**
**我们在 java8** 之前就已经使用了函数式接口,它们是通过使用这些接口创建匿名内部类来使用的。你必须已经看过像`Runnable``ActionListener``Comparator`等函数式接口。它们都有单一的抽象方法。让我们看一个`ActionListener`的例子,看看它如何与`Anonymous`内部类一起使用,以及如何使用 lambda 表达式实现它。
**`ActionListener`示例:在 Java 8 之前:使用匿名内部类**
```java
import javax.swing.*;
......@@ -96,7 +97,7 @@ class Example extends JFrame
```
**ActionListener 示例:Lambda 表达式**
**`ActionListener`示例:Lambda 表达式**
```java
import javax.swing.*;
......
......@@ -57,7 +57,7 @@
+ [Java 8 教程](58.md)
+ [Java Lambda 表达式教程与示例](59.md)
+ [Java 8 中的方法参考](60.md)
+ [Java 功能接口](61.md)
+ [Java 函数式接口](61.md)
+ [Java 8 Stream 教程](62.md)
+ [Java 8 Stream Filter 带有示例](63.md)
+ [Java 8 接口更改 - 默认方法和静态方法](64.md)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册