(參數列表) -> { 方法體; return 結果; } // 完整形式
(參數列表) -> 表達式 // 單行表達式,隱式返回
參數 -> 表達式 // 單參數可省略括號
本質:函數式介面(單一抽象方法介面)的匿名實現實例。
場景:社交應用依條件篩選會員並執行操作(發郵件、列印等)。
void printOlderThan(List<Person> roster, int age) { ... }
void printAgeRange(List<Person> roster, int low, int high) { ... }
interface CheckPerson { boolean test(Person p); }
void printPersons(List<Person> roster, CheckPerson tester) { ... }
printPersons(roster, new CheckPerson() {
public boolean test(Person p) { return p.getAge() >= 18; }
});
printPersons(roster, p -> p.getAge() >= 18);
void printPersons(List<Person> roster, Predicate<Person> tester) { ... }
printPersons(roster, p -> p.getGender()==MALE && p.getAge()>=18);
void process(List<Person> roster, Predicate<Person> filter,
Function<Person, String> mapper, Consumer<String> block) {
roster.stream().filter(filter).map(mapper).forEach(block);
}
<X, Y> void processElements(Iterable<X> src, Predicate<X> filter,
Function<X, Y> mapper, Consumer<Y> block) { ... }
roster.stream()
.filter(p -> p.getGender()==MALE && p.getAge()>=18 && p.getAge()<=25)
.map(Person::getEmailAddress)
.forEach(System.out::println);
| 類型 | 範例 | 等價 Lambda |
|---|---|---|
| 靜態方法 | Integer::parseInt | s -> Integer.parseInt(s) |
| 實例方法 | System.out::println | x -> System.out.println(x) |
| 任意對象實例方法 | String::length | s -> s.length() |
| 建構子 | ArrayList::new | () -> new ArrayList() |
final 或 effectively final(未重新賦值)的區域變數this 指向外部類實例目標類型與捕獲參數皆實作 Serializable 才可序列化,**強烈不建議**序列化 Lambda。
Lambda + Stream + 方法引用,讓 Java 邁入函數式編程新紀元,代碼更簡潔、意圖更清晰、並行更容易。