
Java 教程
- Java – 首頁
- Java – 概述
- Java – 歷史
- Java – 特性
- Java 與 C++
- JVM – Java 虛擬機器
- Java – JDK 與 JRE 與 JVM
- Java – Hello World 程式
- Java – 環境搭建
- Java – 基本語法
- Java – 變數型別
- Java – 資料型別
- Java – 型別轉換
- Java – Unicode 系統
- Java – 基本運算子
- Java – 註釋
- Java – 使用者輸入
- Java – 日期與時間
Java 控制語句
- Java – 迴圈控制
- Java – 決策制定
- Java – if-else
- Java – switch
- Java – for 迴圈
- Java – for-each 迴圈
- Java – while 迴圈
- Java – do-while 迴圈
- Java – break
- Java – continue
面向物件程式設計
- Java – OOPs 概念
- Java – 物件與類
- Java – 類屬性
- Java – 類方法
- Java – 方法
- Java – 變數作用域
- Java – 建構函式
- Java – 訪問修飾符
- Java – 繼承
- Java – 聚合
- Java – 多型
- Java – 重寫
- Java – 方法過載
- Java – 動態繫結
- Java – 靜態繫結
- Java – 例項初始化塊
- Java – 抽象
- Java – 封裝
- Java – 介面
- Java – 包
- Java – 內部類
- Java – 靜態類
- Java – 匿名類
- Java – 單例類
- Java – 包裝類
- Java – 列舉
- Java – 列舉建構函式
- Java – 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤與異常
- Java – 異常
- Java – try-catch 塊
- Java – try-with-resources
- Java – 多重 catch 塊
- Java – 巢狀 try 塊
- Java – finally 塊
- Java – throw 異常
- Java – 異常傳播
- Java – 內建異常
- Java – 自定義異常
Java 多執行緒
- Java – 多執行緒
- Java – 執行緒生命週期
- Java – 建立執行緒
- Java – 啟動執行緒
- Java – 執行緒連線
- Java – 執行緒命名
- Java – 執行緒排程器
- Java – 執行緒池
- Java – 主執行緒
- Java – 執行緒優先順序
- Java – 守護執行緒
- Java – 執行緒組
- Java – 關閉鉤子
Java 同步
Java 網路程式設計
- Java – 網路程式設計
- Java – 套接字程式設計
- Java – URL 處理
- Java – URL 類
- Java – URLConnection 類
- Java – HttpURLConnection 類
- Java – Socket 類
- Java – 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java – 命令列引數
- Java – Lambda 表示式
- Java – 傳送郵件
- Java – Applet 基礎
- Java – Javadoc 註釋
- Java – 自動裝箱和拆箱
- Java – 檔案不匹配方法
- Java – REPL (JShell)
- Java – 多版本 Jar 檔案
- Java – 私有介面方法
- Java – 內部類菱形運算子
- Java – 多解析度影像 API
- Java – 集合工廠方法
- Java – 模組系統
- Java – Nashorn JavaScript
- Java – Optional 類
- Java – 方法引用
- Java – 函式式介面
- Java – 預設方法
- Java – Base64 編碼解碼
- Java – switch 表示式
- Java – Teeing 收集器
- Java – 微基準測試
- Java – 文字塊
- Java – 動態 CDS 歸檔
- Java – Z 垃圾收集器 (ZGC)
- Java – 空指標異常
- Java – 打包工具
- Java – 密封類
- Java – 記錄類
- Java – 隱藏類
- Java – 模式匹配
- Java – 簡潔的數字格式化
- Java – 垃圾收集
- Java – JIT 編譯器
Java 其他
- Java – 遞迴
- Java – 正則表示式
- Java – 序列化
- Java – 字串
- Java – Process API 改進
- Java – Stream API 改進
- Java – 增強的 @Deprecated 註解
- Java – CompletableFuture API 改進
- Java – 流
- Java – 日期時間 API
- Java 8 – 新特性
- Java 9 – 新特性
- Java 10 – 新特性
- Java 11 – 新特性
- Java 12 – 新特性
- Java 13 – 新特性
- Java 14 – 新特性
- Java 15 – 新特性
- Java 16 – 新特性
Java API 與框架
Java 類引用
- Java – Scanner
- Java – 陣列
- Java – 字串
- Java – Date
- Java – ArrayList
- Java – Vector
- Java – Stack
- Java – PriorityQueue
- Java – LinkedList
- Java – ArrayDeque
- Java – HashMap
- Java – LinkedHashMap
- Java – WeakHashMap
- Java – EnumMap
- Java – TreeMap
- Java – IdentityHashMap
- Java – HashSet
- Java – EnumSet
- Java – LinkedHashSet
- Java – TreeSet
- Java – BitSet
- Java – Dictionary
- Java – Hashtable
- Java – Properties
- Java – Collection
- Java – Array
Java 有用資源
Java – Lambda 表示式
Java Lambda 表示式
Lambda 表示式在 Java 8 中引入,被譽為 Java 8 最大的特性。Lambda 表示式促進了函數語言程式設計,並大大簡化了開發。Lambda 表示式基於函式式介面的原理。函式式介面是一個介面,只有一個方法需要實現。Lambda 表示式提供了函式式介面方法的實現。
Lambda 表示式大大簡化了函數語言程式設計,並使程式碼更易讀,無需任何樣板程式碼。Lambda 表示式可以推斷使用的引數型別,並且可以在沒有 return 關鍵字的情況下返回值。對於簡單的單語句方法,甚至可以省略大括號。
Lambda 表示式語法
Lambda 表示式的語法特徵如下。
parameter -> expression body
Java Lambda 表示式的特性
以下是 Lambda 表示式的重要特性。
可選型別宣告 – 無需宣告引數的型別。編譯器可以從引數的值中推斷出來。
可選的引數圓括號 – 無需在圓括號中宣告單個引數。對於多個引數,需要圓括號。
可選的大括號 – 如果表示式體包含單個語句,則無需使用大括號。
可選的 return 關鍵字 – 如果主體只有一個表示式來返回值,編譯器會自動返回值。需要大括號來指示表示式返回值。
Java Lambda 表示式示例
在這個例子中,我們有一個函式式介面 MathOperation,它有一個 operate 方法,可以接受兩個 int 引數,執行操作並將結果作為 int 返回。使用 lambda 表示式,我們建立了 MathOperation operate 方法的四個不同實現,用於新增、減去、乘以和除以兩個整數並獲得相應的結果。然後我們有另一個函式式介面 GreetingService,它有一個 sayMessage 方法,我們用它來列印訊息到控制檯。
package com.tutorialspoint; public class JavaTester { public static void main(String args[]) { JavaTester tester = new JavaTester(); //with type declaration MathOperation addition = (int a, int b) -> a + b; //with out type declaration MathOperation subtraction = (a, b) -> a - b; //with return statement along with curly braces MathOperation multiplication = (int a, int b) -> { return a * b; }; //without return statement and without curly braces MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); //without parenthesis GreetingService greetService1 = message -> System.out.println("Hello " + message); //with parenthesis GreetingService greetService2 = (message) -> System.out.println("Hello " + message); greetService1.sayMessage("Mahesh"); greetService2.sayMessage("Suresh"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } }
輸出
讓我們編譯並執行上面的程式,這將產生以下結果:
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
以下是上述示例中需要注意的重要幾點。
Lambda 表示式主要用於定義函式式介面的內聯實現,即只有一個方法的介面。在上面的示例中,我們使用了各種型別的 lambda 表示式來定義 MathOperation 介面的 operation 方法。然後我們定義了 GreetingService 的 sayMessage 的實現。
Lambda 表示式消除了對匿名類的需求,併為 Java 提供了一種非常簡單而強大的函數語言程式設計能力。
Java Lambda 表示式的範圍
使用 lambda 表示式,您可以引用任何 final 變數或有效 final 變數(只賦值一次)。如果變數第二次賦值,lambda 表示式會丟擲編譯錯誤。
在 Lambda 表示式中使用常量
在這個例子中,我們有一個函式式介面 GreetingService,它有一個 sayMessage 方法,我們用它來列印訊息到控制檯。現在在 Java Tester 類中,我們有一個 final 類欄位 salutation,它的值是 "Hello! "。現在在 lambda 表示式中,我們可以在沒有任何錯誤的情況下使用這個 final 欄位。
在 Lambda 表示式中使用常量的示例
public class JavaTester { final static String salutation = "Hello! "; public static void main(String args[]) { GreetingService greetService1 = message -> System.out.println(salutation + message); greetService1.sayMessage("Mahesh"); } interface GreetingService { void sayMessage(String message); } }
輸出
讓我們編譯並執行上面的程式,這將產生以下結果:
Hello! Mahesh
在集合中使用 Lambda 表示式
從 Java 8 開始,幾乎所有集合都增強了對lambda表示式的支援,可以使用lambda表示式來執行集合操作。例如,迭代列表、過濾列表、排序列表等等。本例展示瞭如何使用lambda表示式迭代字串列表並列印所有元素,以及如何列印列表中所有偶數。
在集合中使用Lambda表示式的示例
package com.tutorialspoint; import java.util.ArrayList; import java.util.List; public class JavaTester { public static void main(String args[]) { // prepare a list of strings List<String> list = new ArrayList<>(); list.add("java"); list.add("html"); list.add("python"); // print the list using a lambda expression // here we're passing a lambda expression to forEach // method of list object list.forEach(i -> System.out.println(i)); List<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); numbers.add(5); numbers.add(6); numbers.add(7); numbers.add(8); System.out.println(numbers); // filter the list using a lambda expression // here we're passing a lambda expression to removeIf // method of list object where we can checking // if number is divisible by 2 or not numbers.removeIf( n -> n%2 != 0); System.out.println(numbers); } }
輸出
讓我們編譯並執行上面的程式,這將產生以下結果:
java html python [1, 2, 3, 4, 5, 6, 7, 8] [2, 4, 6, 8]