Lambda 表達(dá)式
- Lambda 表達(dá)式語法
Lambda 表達(dá)式語法包含三個部分:
- 參數(shù)列表:函數(shù)的入?yún)ⅰ?/li>
- 箭頭:把參數(shù)列表和 Lambda 主體分開。
- Lambda 主體:函數(shù)主要實現(xiàn)的功能
(String s1,String s2) -> s1.length().compareTo(s2.length());
其中,(String s1,String s2)為參數(shù)列表,s1.length().compareTo(s2.length());為Lambda主體。
Lambda 表達(dá)式的基本語法:
(parameters) -> expression
// 或者(請注意花括號)
(parameters) -> {statements;}
- Lambdas及函數(shù)式接口的例子
| 使用案例 | Lambdas例子 | 對應(yīng)的函數(shù)式接口 |
|---|---|---|
| boolean 表達(dá)式 | List<String> list -> list.isEmpty() |
Predicate<List<String>> |
| 創(chuàng)建對象 | () -> new Apple(10) |
Supplier<Apple> |
| 消費對象 | (Apple a) -> System.out.println(a.getWeight()) |
Consumer<Apple> |
| 從一個對象中提取 | (String s) -> s.length() |
Function<String,Integer>或<ToIntFunction<String> |
- 方法引用
Lambda 及其等效方法方法引用示例
| Lambda | 等效引用方法 |
|---|---|
(Apple a) -> a.getWeight() |
Apple::getWeight |
() -> Thread.currentThread().dumpStack |
Thread.currentThread::dumpStack |
(String s) -> System.out.println(s) |
System.out::println |
Java8 引入流
- 流是什么
流是Java API的新成員,它允許你以聲明的方式處理數(shù)據(jù)集合。可以把它們看作是遍歷數(shù)據(jù)集的高級迭代器。
流使用樣例:
List<String> names = menu.stream()
.filter(d -> d.getCalories() > 300)
.map(Dish::getName)
.limit(3)
.collect(toList());
該表達(dá)式的含義:過濾卡路里大于 300 的三盤菜
- 如何使用流
流的使用一般包含三件事
- 一個數(shù)據(jù)源。
- 中間操作,形成一個流的流水線
- 一個終端,生成結(jié)果。
- 流的中間操作
| 操作 | 類型 | 返回類型 | 操作函數(shù) | 函數(shù)描述符 |
|---|---|---|---|---|
| filter | 中間 | Stream<T> | Predicate<T> | T -> boolean |
| map | 中間 | Stram<T> | Function<T,R> | T -> R |
| limit | 中間 | Stream<T> | ||
| sort | 中間 | Steam<T> | Comparator<T> | (T,T) -> int |
| distinct | 中間 | Steam<T> |
- 流的終端操作
| 操作 | 類型 | 目的 |
|---|---|---|
| forEach | 終端 | 消費流中的每一個元素并對其應(yīng)用 Lambda,該操作返回 void |
| count | 終端 | 返回流中的個數(shù),該操作返回 long |
| collect | 終端 | 把流歸約成一個集合,如 List、Map甚至是 Integer |
- map使用
返回集合中每個字段的長度:
List<String> words = Arrays.asList("Hello","Word","Java 8","Lambdas","Actions");
List<Integer> wordLengths = words.stream().map(String::length).collect(Collectors.toList());
- 匹配
數(shù)據(jù)是否匹配條件
// 是否都匹配
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories <1000);
// 確保沒有匹配
boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories>=1000);
- 計數(shù)
long count = list.stream().filter(s -> s.equals("A")).count();
- 取交集
List<String> updateData = param.stram().filter(all::contains).collect(Collectors.toList());
其中,all:["aaa","bbb", "ccc", "ddd", "eee"] ,param:["aaa", "ccc", "fff"]
- 取param的非交集
List<String> add = param.stream().filter(s ->!all.contains(s)).collect(Collectors.toList());