JAVA8之collect總結(給自己)
一,collect是一個終端操作,它接收的參數是將流中的元素累積到彙總結果的各種方式(稱爲收集器)
二,預定義收集器包括將流元素歸約和彙總到一個值.如下
工廠方法 |
返回類型 |
用於 |
toList |
List<T> |
把流中所有元素收集到List中 |
示例:List<Menu> menus=Menu.getMenus.stream().collect(Collectors.toList()) |
||
toSet |
Set<T> |
把流中所有元素收集到Set中,刪除重複項 |
示例:Set<Menu> menus=Menu.getMenus.stream().collect(Collectors.toSet()) |
||
toCollection |
Collection<T> |
把流中所有元素收集到給定的供應源創建的集合中 |
示例:ArrayList<Menu> menus=Menu.getMenus.stream().collect(Collectors.toCollection(ArrayList::new)) |
||
Counting |
Long |
計算流中元素個數 |
示例:Long count=Menu.getMenus.stream().collect(counting); |
||
SummingInt |
Integer |
對流中元素的一個整數屬性求和 |
示例:Integer count=Menu.getMenus.stream().collect(summingInt(Menu::getCalories)) |
||
averagingInt |
Double |
計算流中元素integer屬性的平均值 |
示例:Double averaging=Menu.getMenus.stream().collect(averagingInt(Menu::getCalories)) |
||
Joining |
String |
連接流中每個元素的toString方法生成的字符串 |
示例:String name=Menu.getMenus.stream().map(Menu::getName).collect(joining(“, ”)) |
||
maxBy |
Optional<T> |
一個包裹了流中按照給定比較器選出的最大元素的optional |
示例:Optional<Menu> fattest=Menu.getMenus.stream().collect(maxBy(Menu::getCalories)) |
||
minBy |
Optional<T> |
一個包裹了流中按照給定比較器選出的最大元素的optional |
示例: Optional<Menu> lessest=Menu.getMenus.stream().collect(minBy(Menu::getCalories)) |
||
Reducing |
歸約操作產生的類型 |
從一個作爲累加器的初始值開始,利用binaryOperator與流中的元素逐個結合,從而將流歸約爲單個值 |
示例:int count=Menu.getMenus.stream().collect(reducing(0,Menu::getCalories,Integer::sum)); |
||
collectingAndThen |
轉換函數返回的類型 |
包裹另一個轉換器,對其結果應用轉換函數 |
示例:Int count=Menu.getMenus.stream().collect(collectingAndThen(toList(),List::size)) |
||
groupingBy |
Map<K,List<T>> |
根據流中元素的某個值對流中的元素進行分組,並將屬性值做爲結果map的鍵 |
示例:Map<Type,List<Menu>> menuType=Menu.getMenus.stream().collect(groupingby(Menu::getType)) |
||
partitioningBy |
Map<Boolean,List<T>> |
根據流中每個元素應用謂語的結果來對項目進行分區 |
示例:Map<Boolean,List<Menu>> menuType=Menu.getMenus.stream().collect(partitioningBy(Menu::isType)); |
三,預定義收集器可以用groupby對流中元素進行分組或者用partitioningBy進行分區
四,收集器可以高效的復合起來,進行多級分組,多級分區和歸約
五,可以自己實現collector接口進行定義自己的收集器