#### Stream
* 流不存儲元素;它們存儲在底層的集合或者按需生成;
* 流操作不改變它們的源數據;例如filter方法不會從一個新流中刪除元素,而是生成一個不包含特定元素的新流;
* Stream操作可能是延遲執行的;
* 和迭代器類似,流只能遍歷一次
* filter和map等操作是無狀態的,它們并不存儲任何狀態。reduce等操作要存儲狀態才能計算出一個值。sorted和distinct等操作也要存儲狀態,因為它們需要把流中的所有元素緩存起來才能返回一個新的流。這種操作稱為有狀態操作
### 支持兩種類型操作:
* 中間操作(如filter或map)
* 終端操作(如count、findFirst、forEach和reduce)
### 常用API
* IntStream.rangeClosed\(1, 100\):rangeClosed方法來生成1到100之間的所有數字
* Stream.of:顯式值創建一個流
* Stream.empty\(\):創建一個空流
* Arrays.stream\(numbers\):從數組創建一個流
### 外部迭代與內部迭代
使用Collection接口需要用戶去做迭代(比如用for-each),這稱為外部迭代
Streams庫使用內部迭代——它幫你把迭代做了,還把得到的流值存在了某個地方,你只要給出一個函數說要干什么就可以了
#### API
| Stream操作 | 描述 |
| --- | --- |
| filter | filter轉換生成一個匹配一定條件的新流過濾 |
| mapToXXX | 使用toXXXFunction對流中的元素執行一對一的轉換,該方法返回的新流中包含了toXXXFunction轉換生成的所有元素; |
| forEach | 迭代 |
| count | 統計 |
| map | 將流中的值進行某種轉換 |
| reduce | 歸約操作 |
| generate | 接受一個無參數的函數 |
| iterate | iterate方法接受一個"種子"值和一個函數并對之前的值重復應用該函數 |
| limit | 返回一個包含n個元素的新流 |
| skip | 跳過或丟棄前n個元素 |
| toArray | 返回一個數組 |
| collect | 收集 |
| concat | 連接兩個流 |
| distinct | 過濾重復元素 |
| sorted | 排序 |
| peek | 每當檢索元素的時候就會調用一次\(可用來調試流\) |
| max | 取最大值 |
| min | 取最小值 |
| findFirst | 返回非空集合中的第一個值 |
| findAny | 返回任何一個匹配的元素 |
| anyMatch | 返回是否含有匹配元素 |
| flatMap | flatmap方法讓你把一個流中的每個值都換成另一個流,然后把所有的流連接起來成為一個流 |
#### Method
```
Stream<String> stream = Stream.of("1,2,3,4,10".split(","));
Arrays.stream("h,2,34,3".split(",")).forEach(System.err::println);
// Stream<Double> stm = Stream.generate(Math::random).limit(10); // 如果沒有limit流會一直運行
Stream<String> stm = Stream.generate(() -> "hello").limit(10);
Pattern.compile("\\PL+").splitAsStream("hello,world").forEach(System.err::println);
```
#### CodeList
```
Runnable run = () -> System.out.println("running...”); ##不帶參數
ActionListener action = event -> System.err.println("button click”); ##帶參數
Runnable run = () -> { ##代碼塊
System.out.println("running...");
System.err.println("end");
return;
};
IntSummaryStatistics summaryStatistics = list.stream().mapToInt(e -> e.intValue()).summaryStatistics(); //統計
方法引用:System.out::println(語法:Classname::method)
```

### 常見用法
```
// 打印輸出
list.stream().forEach(System.err::println);
// 過濾
list.stream().filter(t -> t > 50).forEach(System.out::println);
// 排序
list.stream().sorted((x1, x2) -> x2.compareTo(x1)).forEach(System.err::println);
// 求總記錄數
System.err.println(list.stream().count());
// 轉換為Map
Map<String, TerraOrderBill> billMap = orderBillList.stream().collect(
Collectors.toMap(TerraOrderBill::getBillId,bill -> bill));
// 求和
double totalAmount = seEntries.stream().mapToDouble(t -> t.getRealPayAmount()).sum();
// distinct
recordEntrys.stream().filter(t -> !StringUtils.isEmpty(t.getSupplierId()))
.map(SettlementRecordEntry::getSupplierId).distinct().collect(Collectors.toList());
// 并行處理
sum = list.parallelStream().mapToInt(t -> t.intValue()).sum();
```
- java演變
- JDK各個版本的新特性
- JDK1.5新特性
- JDK1.6新特性
- JDK1.7新特性
- JDK1.8新特性
- JAVA基礎
- 面向對象特性
- 多態
- 方法重載
- 方法重寫
- class
- 常量
- 訪問修飾符
- 類加載路徑
- java-equals
- 局部類
- java-hashCode
- Java類初始化順序
- java-clone方法
- JAVA對象實例化的方法
- 基礎部分
- JAVA基礎特性
- JAVA關鍵字
- javabean
- static
- 日期相關
- final
- interface
- 函數式接口
- JAVA異常
- 異常屏蔽
- try-with-resource資源泄露
- JAVA引用
- WeakReference
- SoftReference
- PhantomReference
- 位運算符
- try-with-resource語法糖
- JDK冷知識
- JAVA包裝類
- JAVA基本類型與包裝類
- java.lang.Boolean
- java.lang.Integer
- java.lang.Byte
- java.lang.Short
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.lang.Character
- 日期相關
- TemporalAdjusters
- String
- 字符串常量池
- String拼接
- String編譯期優化
- StringBuilder&StringBuffer
- intern
- 注解
- java標準注解
- 內置注解
- 元注解
- 自定義注解
- 注解處理器
- JVM注解
- Java8 Annotation新特性
- 反射-Reflective
- Reflection
- Class
- Constructor
- Method
- javabean-property
- MethodHandles
- 泛型
- 類型擦除
- bridge-method
- Accessor&Mutator方法
- enum
- JAVA數組
- finalize方法
- JAR文件
- JAVA高級編程
- CORBA
- JMX
- SPI
- Java SPI使用約定
- ServiceLoader
- 實際應用
- IO
- 工具類
- JDK常用工具類
- Objects
- System
- Optional
- Throwable
- Collections
- Array
- Arrays
- System
- Unsafe
- Number
- ClassLoader
- Runtime
- Object
- Comparator
- VarHandle
- 數據結構
- 棧-Stack
- 隊列(Queue)
- Deque
- PriorityQueue
- BlockingQueue
- SynchronousQueue
- ArrayBlockingQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- ConcurrentLinkedQueue
- 列表
- 迭代器
- KV鍵值對數據類型
- HashMap
- TreeMap
- Hash沖突
- ConcurrentHashMap
- JDK1.7 ConcurrentHashMap結構
- jdk7&jdk8區別
- 集合
- Vector
- Stack
- HashSet
- TreeSet
- ArrayList
- LinkedList
- ArrayList && LinkedList相互轉換
- 線程安全的集合類
- 集合類遍歷性能
- 并發容器
- CopyOnWriteArrayList
- ConcurrentHashMap
- 同步容器
- BitMap
- BloomFilter
- SkipList
- 設計模式
- 設計模式六大原則
- 單例模式
- 代理模式
- 靜態代理
- 動態代理
- JDK動態代理
- cglib動態代理
- spring aop
- 策略模式
- SpringAOP策略模式的運用
- 生產者消費者模式
- 迭代器模式
- 函數式編程
- 方法引用
- 性能問題
- Lambda
- Lambda類型檢查
- Stream
- findFirst和findAny
- reduce
- 原始類型流特化
- 無限流
- 收集器
- 并行流
- AOP
- 靜態織入
- aspect
- aspect的定義
- AspectJ與SpringAOP
- 動態織入
- 靜態代理
- 動態代理
- JDK動態代理
- CGLib動態代理
- Spring AOP
- SpringAOP五種通知類型
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- Aspect優先級
- SpringAOP切點表達式
- within
- execution
- 嵌套調用
- 系統優化與重構
- 重疊構造器模式
- 工具類構造器優化
- 常見面試題
- new Object()到底占用幾個字節
- 訪問修飾符
- cloneable接口實現原理
- 異常分類以及處理機制
- wait和sleep的區別
- 數組在內存中如何分配
- 類加載為什么要使用雙親委派模式,有沒有什么場景是打破了這個模式
- 類的實例化順序
- 附錄
- JAVA術語
- FAQ
- 墨菲定律
- 康威定律
- 軟件設計原則
- 阿姆達爾定律
- 字節碼工具
- OSGI