【Java8新特性】面試官:談談Java8中的Stream API有哪些終止操作?
阿新 • • 發佈:2020-05-29
## 寫在前面
> 如果你出去面試,面試官問了你關於Java8 Stream API的一些問題,比如:Java8中建立Stream流有哪幾種方式?(可以參見:《[【Java8新特性】面試官問我:Java8中建立Stream流有哪幾種方式?](https://www.cnblogs.com/binghe001/p/12961977.html)》)Java8中的Stream API有哪些中間操作?(可以參見:《[【Java8新特性】Stream API有哪些中間操作?看完你也可以吊打面試官!!](https://www.cnblogs.com/binghe001/p/12969825.html)》)如果你都很好的回答了這些問題,那麼,面試官可能又會問你:Java8中的Stream API有哪些終止操作呢?沒錯,這就是Java8中有關Stream API的靈魂三問!不要覺得是面試官在為難你,只有你掌握了這些細節,你就可以反過來吊打面試官了!
## Stream的終止操作
終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如: List、 Integer、Double、String等等,甚至是 void 。
在Java8中,Stream的終止操作可以分為:查詢與匹配、規約和收集。接下來,我們就分別簡單說明下這些終止操作。
## 查詢與匹配
Stream API中有關查詢與匹配的方法如下表所示。
| 方法 | 描述 |
| ---------------------- | ------------------------------------------------------------ |
| allMatch(Predicate p) | 檢查是否匹配所有元素 |
| anyMatch(Predicate p) | 檢查是否至少匹配一個元素 |
| noneMatch(Predicate p) | 檢查是否沒有匹配所有元素 |
| findFirst() | 返回第一個元素 |
| findAny() | 返回當前流中的任意元素 |
| count() | 返回流中元素總數 |
| max(Comparator c) | 返回流中最大值 |
| min(Comparator c) | 返回流中最小值 |
| forEach(Consumer c) | 內部迭代(使用 Collection 介面需要使用者去做迭代,稱為外部迭代。相反, Stream API 使用內部迭代) |
同樣的,我們對每個重要的方法進行簡單的示例說明,這裡,我們首先建立一個Employee類,Employee類的定義如下所示。
```java
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
private static final long serialVersionUID = -9079722457749166858L;
private String name;
private Integer age;
private Double salary;
private Stauts stauts;
public enum Stauts{
WORKING,
SLEEPING,
VOCATION
}
}
```
接下來,我們在測試類中定義一個用於測試的集合employees,如下所示。
```java
protec