Stream API爲咱們提供了Stream.reduce
用來實現集合元素的歸約。reduce函數有三個參數:vue
注意觀察上面的圖,咱們先來理解累加器:spring
reduce初始值爲0,累加器能夠是lambda表達式,也能夠是方法引用。後端
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int result = numbers .stream() .reduce(0, (subtotal, element) -> subtotal + element); System.out.println(result); //21 int result = numbers .stream() .reduce(0, Integer::sum); System.out.println(result); //21
不只能夠歸約Integer類型,只要累加器參數類型可以匹配,能夠對任何類型的集合進行歸約計算。springboot
List<String> letters = Arrays.asList("a", "b", "c", "d", "e"); String result = letters .stream() .reduce("", (partialString, element) -> partialString + element); System.out.println(result); //abcde String result = letters .stream() .reduce("", String::concat); System.out.println(result); //ancde
計算全部的員工的年齡總和。前後端分離
Employee e1 = new Employee(1,23,"M","Rick","Beethovan"); Employee e2 = new Employee(2,13,"F","Martina","Hengis"); Employee e3 = new Employee(3,43,"M","Ricky","Martin"); Employee e4 = new Employee(4,26,"M","Jon","Lowman"); Employee e5 = new Employee(5,19,"F","Cristine","Maria"); Employee e6 = new Employee(6,15,"M","David","Feezor"); Employee e7 = new Employee(7,68,"F","Melissa","Roy"); Employee e8 = new Employee(8,79,"M","Alex","Gussin"); Employee e9 = new Employee(9,15,"F","Neetu","Singh"); Employee e10 = new Employee(10,45,"M","Naveen","Jain"); List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); Integer total = employees.stream().map(Employee::getAge).reduce(0,Integer::sum); System.out.println(total); //346
除了使用map函數實現類型轉換後的集合歸約,咱們還能夠用Combiner合併器來實現,這裏第一次使用到了Combiner合併器。
由於Stream流中的元素是Employee,累加器的返回值是Integer,因此兩者的類型不匹配。這種狀況下可使用Combiner合併器對累加器的結果進行二次歸約,至關於作了類型轉換。函數
Integer total3 = employees.stream() .reduce(0,(totalAge,emp) -> totalAge + emp.getAge(),Integer::sum); //注意這裏reduce方法有三個參數 System.out.println(total); //346
計算結果和使用map進行數據類型轉換的方式是同樣的。微服務
對於大數據量的集合元素歸約計算,更能體現出Stream並行流計算的威力。大數據
在進行並行流計算的時候,可能會將集合元素分紅多個組計算。爲了更快的將分組計算結果累加,可使用合併器。spa
Integer total2 = employees .parallelStream() .map(Employee::getAge) .reduce(0,Integer::sum,Integer::sum); //注意這裏reduce方法有三個參數 System.out.println(total); //346
以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。code