恕我直言你可能真的不會java第10篇-集合元素歸約

Stream API爲咱們提供了Stream.reduce用來實現集合元素的歸約。reduce函數有三個參數:vue

  • Identity標識:一個元素,它是歸約操做的初始值,若是流爲空,則爲默認結果。
  • Accumulator累加器:具備兩個參數的函數:歸約運算的部分結果和流的下一個元素。
  • Combiner合併器(可選):當歸約並行化時,或當累加器參數的類型與累加器實現的類型不匹配時,用於合併歸約操做的部分結果的函數。


注意觀察上面的圖,咱們先來理解累加器:spring

  • 階段累加結果做爲累加器的第一個參數
  • 集合遍歷元素做爲累加器的第二個參數

Integer類型歸約

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

String類型歸約

不只能夠歸約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將Stream流中的元素由Employee類型處理爲Integer類型(age)。
  • 而後對Stream流中的Integer類型進行歸約

Combiner合併器的使用

除了使用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

相關文章
相關標籤/搜索