# Java Lambda:初學者指南
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-lambda-beginners-guide/](https://javabeginnerstutorial.com/core-java-tutorial/java-lambda-beginners-guide/)
本文介紹了 Java 8 中的 Java Lambda 表達式。[您可以在此處找到完整的代碼](https://github.com/JBTAdmin/java-tutorial/tree/master/lambda/src)。
## Java Lambda 表達式
Java Lambda 表達式是 Java 的一個重要的新功能,已在 Java 8 中引入。Lambda 表達式是不屬于任何類的匿名函數(無名稱的函數),表示該函數沒有名稱,并且沒有類。 Lambda 表達式通過促進 Java 中的函數式編程大大簡化了開發。 它用于提供函數式接口的實現(函數式接口是僅包含一種方法的接口。例如,Java 標準的`Runnable`接口是函數式接口)。 它還有助于迭代,過濾和從集合庫中提取數據。 Lambda 表達式使您可以將代碼視為數據,將函數視為方法參數。
### Lambda 表達式的語法
讓我們討論 Lambda 表達式的語法。
Lambda 表達式包含三個組件,一組參數,一個 Lambda 運算符和一個函數體。 這是三個組成部分
* **參數列表**:這里是參數,也可以為空或非空。
* **Lambda 表達式**: Lambda 表達式或箭頭(`->`)用于分隔參數列表和函數體。
* **函數正文**:它包含 Lambda 表達式的函數語句。
輸入參數在 lambda 運算符的左側,而函數體在 lambda 運算符的右側。 此 Lambda 表達式語法可減少將五行代碼合并為一行的代碼的龐大性。
參數列表`->`函數正文
### Lambda 表達的特征
以下是 Lambda 表達的一些重要特征。
* **類型聲明**:類型聲明是可選的。 由您自己決定,如果您不聲明參數類型,則編譯器可以從參數值中進行猜測。 例如你可以寫
```java
(5,4) -> function body
```
* **參數周圍的括號**:參數周圍的括號也是可選的。 您可以根據需要放置括號,否則保留原樣。 如果 Lambda 表達式中有多個參數,則需要括號,如上面的示例所示。 對于一個參數,您可以編寫為
```java
5 -> function body
```
* **花括號**:如果只有一條語句,圍繞函數主體的花括號也是可選的。 對于多個語句,需要在函數主體周圍使用花括號。 例如
```java
(5, 4) -> 5+4;
```
* **返回語句**:在 Lambda 表達式中,返回語句也是可選的。 如果主體具有單個表達式,則 Java 編譯器會自動返回值。 如果函數主體返回一個值,則應使用花括號將其括起來。
### Lambda 表達的示例
以下是 Lambda 表達式的一些示例。
```java
(x, y) -> x+y;
```
上面編寫的 Lambda 表達式表示給定兩個整數`x`,`y`,并返回另一個具有`x`和`y`之和的整數。
另一個
```java
( ) -> 42
```
上面編寫的 Lambda 表達式表示未給出整數,并返回整數 42。
**前提條件**
要運行 Java Lambda 表達式,必須滿足以下條件。
* Java 開發套件(JDK8)
* NetBeans 或 Eclipse
### 沒有參數的 Lambda 表達式
在此示例中,我將展示如何使用不帶參數的 Java Lambda 表達式。 打開您的 IDE(我將使用 Eclipse Neon)并開始創建一個新項目。 將其命名為`Lambda`。 創建一個名為`NoParameter`的類。
```java
public class NoParameter {
public static void main(String[] args) {
// TODO Auto-generated method stub
// lambda expression with return type
NoParameterInterface message = () -> {
return "Hello World with No Parameter";
};
System.out.println( message.HelloWorld( ));
}
}
@FunctionalInterface
interface NoParameterInterface {
//Here is a method with no parameter and return type as String
public String HelloWorld();
}
```
上面的示例通過使用不帶參數的 Lambda 表達式顯示了一個 Hello World 消息。
### 單參數 Lambda 表達式
您已經看到了不帶參數的 Lambda 表達式示例。 我們來看一個帶有單個參數的 Lambda 表達式示例。 為此,創建一個名為`SingleParameter`的類,并將以下代碼粘貼在那里。
```java
public class SingleParameter {
public static void main(String[] args) {
// TODO Auto-generated method stub
// lambda expression with single parameter num and returns square of num without any return statement
SingleParameterInterface Square = (num) -> num*num;
System.out.println(Square.SquareOfFive(5));
}
}
@FunctionalInterface
interface SingleParameterInterface {
//A method with single parameter and return type as int
public int SquareOfFive(int s);
}
```
上面的示例顯示了帶有單個參數的 Lambda 表達式。 它以 5 作為輸入,并返回 5 的平方,而沒有任何`return`語句。 如上所述,如果只有一條語句,則無需指定`return`關鍵字。 編譯器會自動返回該值。
### 多參數 Lambda 表達式
讓我們以包含多個參數的 Java Lambda 表達式為例。 創建一個新的 Java 類,并將其命名為`MulipleParamater`。 打開它,并在其中粘貼以下代碼。
```java
public class MulipleParamater {
public static void main(String[] args) {
// TODO Auto-generated method stub
//lambda expression which add two number
MulipleParamaterInterface add = (a, b) -> a + b;
System.out.println("Sum of 5 and 4 is: "+add.sum(5, 4));
}
}
interface MulipleParamaterInterface {
//here is a method with multiple parameter and int as return type
public int sum(int a, int b);
}
```
上面的示例顯示了具有多個參數的 Lambda 表達式。 它以 5 和 4 作為輸入,并返回`sum`為 9。同樣,它無需指定`return`關鍵字即可工作。
### 事件監聽器
讓我們探索一些更高級的示例,這些示例是 Java 中的事件監聽器。 Lambda 表達式如何用于實現事件監聽器。 您將看到帶有 Lambda 表達式和沒有 Lambda 表達式的事件監聽器的兩個示例。
**沒有 Lambda 表達式的事件監聽器**
首先,檢查沒有 Lambda 表達式的事件監聽器。 轉到 eclipse 并創建一個新類,將其命名為`eListener`。 打開它并粘貼以下代碼。
```java
import java.awt.event.*; //import for event listener
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 eListener {
//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);
//action listener on button
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
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);
}
}
```
上面編寫的代碼顯示了 Java 中不使用 Lambda 表達式的事件監聽器的示例。 因此,您必須熟悉該代碼。 使用了簡單的`JButton``,JFrame`和`JTextField`。 當用戶單擊按鈕時,文本字段將顯示 Hello World 消息。 這是輸出

**具有 Lambda 表達式的事件監聽器**
現在使用 Lambda 表達式檢查事件監聽器。 轉到 eclipse 并創建一個名為`eListenerLambda`的新類。打開并粘貼以下代碼。
```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-> {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);
}
}
```
上面編寫的代碼顯示了帶有 Lambda 表達式的 Java 事件監聽器的示例。 如果我們將這兩個代碼進行比較,您將檢查第一個示例中的動作監聽器代碼是否包含三個語句,而使用 Lambda 表達式可以在一個語句中解決問題。 這兩個代碼的輸出與上面顯示的相同。
### 使用 Lambda 表達式的比較器示例
讓我們再看看使用 Lambda 表達式作為比較器示例的另一段代碼。 創建一個新類,并將其命名為`Comparatorlambda.java`。 打開它并粘貼以下代碼。
```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<Account> list=new ArrayList<Account>();
//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)->{
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);
}
}
}
```
此示例具有一個帳戶類,其中包含名稱,號碼和帳戶余額之類的帳戶信息。 Lambda 表達式用于根據帳戶名稱對帳戶進行比較和排序。 這是用于此目的的 Lambda 表達式。
```java
Collections.sort(list,(p1,p2)->{return p1.name.compareTo(p2.name); });
```
以下是此代碼的輸出

## 總結
Lambda 表達式用于定義函數式接口的內聯實現。 您在上面的示例中看到,Lambda 表達式節省了我們的時間,并大大減少了代碼語句。 它通過促進函數式編程為 Java 提供了強大的功能。 Java 的這一新功能改變了完整的編碼方式,簡化了開發過程,因為它利用了多核環境的并行功能。
- JavaBeginnersTutorial 中文系列教程
- Java 教程
- Java 教程 – 入門
- Java 的歷史
- Java 基礎知識:Java 入門
- jdk vs jre vs jvm
- public static void main(string args[])說明
- 面向初學者的 Java 類和對象教程
- Java 構造器
- 使用 Eclipse 編寫 Hello World 程序
- 執行順序
- Java 中的訪問修飾符
- Java 中的非訪問修飾符
- Java 中的數據類型
- Java 中的算術運算符
- Java 語句初學者教程
- 用 Java 創建對象的不同方法
- 內部類
- 字符串構建器
- Java 字符串教程
- Java 教程 – 變量
- Java 中的變量
- Java 中的局部變量
- Java 中的實例變量
- Java 引用變量
- 變量遮蓋
- Java 教程 – 循環
- Java for循環
- Java 教程 – 異常
- Java 異常教程
- 異常處理 – try-with-resources語句
- Java 異常處理 – try catch塊
- Java 教程 – OOPS 概念
- Java 重載
- Java 方法覆蓋
- Java 接口
- 繼承
- Java 教程 – 關鍵字
- Java 中的this關鍵字
- Java static關鍵字
- Java 教程 – 集合
- Java 數組教程
- Java 集合
- Java 集合迭代器
- Java Hashmap教程
- 鏈表
- Java 初學者List集合教程
- Java 初學者的Map集合教程
- Java 初學者的Set教程
- Java 初學者的SortedSet集合教程
- Java 初學者SortedMap集合教程
- Java 教程 – 序列化
- Java 序列化概念和示例
- Java 序列化概念和示例第二部分
- Java 瞬態與靜態變量
- serialVersionUID的用途是什么
- Java 教程 – 枚舉
- Java 枚舉(enum)
- Java 枚舉示例
- 核心 Java 教程 – 線程
- Java 線程教程
- Java 8 功能
- Java Lambda:初學者指南
- Lambda 表達式簡介
- Java 8 Lambda 列表foreach
- Java 8 Lambda 映射foreach
- Java 9
- Java 9 功能
- Java 10
- Java 10 獨特功能
- 核心 Java 教程 – 高級主題
- Java 虛擬機基礎
- Java 類加載器
- Java 開發人員必須知道..
- Selenium 教程
- 1 什么是 Selenium?
- 2 為什么要進行自動化測試?
- 3 Selenium 的歷史
- 4 Selenium 工具套件
- 5 Selenium 工具支持的瀏覽器和平臺
- 6 Selenium 工具:爭霸
- 7A Selenium IDE – 簡介,優點和局限性
- 7B Selenium IDE – Selenium IDE 和 Firebug 安裝
- 7C Selenium IDE – 突破表面:初探
- 7D Selenium IDE – 了解您的 IDE 功能
- 7E Selenium IDE – 了解您的 IDE 功能(續)。
- 7F Selenium IDE – 命令,目標和值
- 7G Selenium IDE – 記錄和運行測試用例
- 7H Selenium IDE – Selenium 命令一覽
- 7I Selenium IDE – 設置超時,斷點,起點
- 7J Selenium IDE – 調試
- 7K Selenium IDE – 定位元素(按 ID,名稱,鏈接文本)
- 7L Selenium IDE – 定位元素(續)
- 7M Selenium IDE – 斷言和驗證
- 7N Selenium IDE – 利用 Firebug 的優勢
- 7O Selenium IDE – 以所需的語言導出測試用例
- 7P Selenium IDE – 其他功能
- 7Q Selenium IDE – 快速瀏覽插件
- 7Q Selenium IDE – 暫停和反射
- 8 給新手的驚喜
- 9A WebDriver – 架構及其工作方式
- 9B WebDriver – 在 Eclipse 中設置
- 9C WebDriver – 啟動 Firefox 的第一個測試腳本
- 9D WebDriver – 執行測試
- 9E WebDriver – 用于啟動其他瀏覽器的代碼示例
- 9F WebDriver – JUnit 環境設置
- 9G WebDriver – 在 JUnit4 中運行 WebDriver 測試
- 9H WebDriver – 隱式等待
- 9I WebDriver – 顯式等待
- 9J WebDriver – 定位元素:第 1 部分(按 ID,名稱,標簽名稱)
- 9K WebDriver – 定位元素:第 2 部分(按className,linkText,partialLinkText)
- 9L WebDriver – 定位元素:第 3a 部分(按cssSelector定位)
- 9M WebDriver – 定位元素:第 3b 部分(cssSelector續)
- 9N WebDriver – 定位元素:第 4a 部分(通過 xpath)
- 9O WebDriver – 定位元素:第 4b 部分(XPath 續)
- 9P WebDriver – 節省時間的捷徑:定位器驗證
- 9Q WebDriver – 處理驗證碼
- 9R WebDriver – 斷言和驗證
- 9S WebDriver – 處理文本框和圖像
- 9T WebDriver – 處理單選按鈕和復選框
- 9U WebDriver – 通過兩種方式選擇項目(下拉菜單和多項選擇)
- 9V WebDriver – 以兩種方式處理表
- 9W WebDriver – 遍歷表元素
- 9X WebDriver – 處理警報/彈出框
- 9Y WebDriver – 處理多個窗口
- 9Z WebDriver – 最大化窗口
- 9AA WebDriver – 執行 JavaScript 代碼
- 9AB WebDriver – 使用動作類
- 9AC WebDriver – 無法輕松定位元素? 繼續閱讀...
- 10A 高級 WebDriver – 使用 Apache ANT
- 10B 高級 WebDriver – 生成 JUnit 報告
- 10C 高級 WebDriver – JUnit 報表自定義
- 10D 高級 WebDriver – JUnit 報告自定義續
- 10E 高級 WebDriver – 生成 PDF 報告
- 10F 高級 WebDriver – 截屏
- 10G 高級 WebDriver – 將屏幕截圖保存到 Word 文檔
- 10H 高級 WebDriver – 發送帶有附件的電子郵件
- 10I 高級 WebDriver – 使用屬性文件
- 10J 高級 WebDriver – 使用 POI 從 excel 讀取數據
- 10K 高級 WebDriver – 使用 Log4j 第 1 部分
- 10L 高級 WebDriver – 使用 Log4j 第 2 部分
- 10M 高級 WebDriver – 以無頭模式運行測試
- Vue 教程
- 1 使用 Vue.js 的 Hello World
- 2 模板語法和反應式的初探
- 3 Vue 指令簡介
- 4 Vue Devtools 設置
- 5 數據綁定第 1 部分(文本,原始 HTML,JavaScript 表達式)
- 6 數據綁定第 2 部分(屬性)
- 7 條件渲染第 1 部分(v-if,v-else,v-else-if)
- 8 條件渲染第 2 部分(v-if和v-show)
- 9 渲染列表第 1 部分(遍歷數組)
- 10 渲染列表第 2 部分(遍歷對象)
- 11 監聽 DOM 事件和事件修飾符
- 12 監聽鍵盤和鼠標事件
- 13 讓我們使用簡寫
- 14 使用v-model進行雙向數據綁定
- 15 表單輸入綁定
- 18 類綁定
- Python 教程
- Python 3 簡介
- Python 基礎知識 - 又稱 Hello World 以及如何實現
- 如何在 Windows 中安裝 python
- 適用于 Windows,Mac,Linux 的 Python 設置
- Python 數字和字符串
- Python 列表
- Python 集
- Python 字典
- Python 條件語句
- Python 循環
- Python 函數
- 面向對象編程(OOP)
- Python 中的面向對象編程
- Python 3 中的異常處理
- Python 3:猜數字
- Python 3:猜數字 – 回顧
- Python 生成器
- Hibernate 教程
- Hibernate 框架基礎
- Hibernate 4 入門教程
- Hibernate 4 注解配置
- Hibernate 4 的實體關系
- Hibernate 4 中的實體繼承模型
- Hibernate 4 查詢語言
- Hibernate 4 數據庫配置
- Hibernate 4 批處理
- Hibernate 4 緩存
- Hibernate 4 審計
- Hibernate 4 的并發控制
- Hibernate 4 的多租戶
- Hibernate 4 連接池
- Hibernate 自舉