Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 其他

Java APIs 和框架

Java 類引用

Java 有用資源

Java - Teeing 收集器



Java Collectors.teeing() 方法

Java 12 引入了一種新的靜態方法到 Collectors 介面,它可以對 集合 執行兩個不同的操作,然後合併結果。

語法

以下是 teeing 方法的語法:

public static Collector<T, ?, R> teeing(
   Collector<? super T, ?, R1> downstream1,
   Collector<? super T, ?, R2> downstream2, 
   BiFunction<? super R1, ? super R2, R> merger
)

此處,傳遞給 teeing 收集器的集合的每個元素都由 downstream1 和 downstream2 收集器處理,一旦兩個收集器都完成了處理,結果就會傳遞給 BiFunction 收集器以合併結果或進行相應的處理。這類似於對集合呼叫兩個函式,然後呼叫第三個函式來處理前兩個函式的結果。

在這裡,我們對集合執行不同的函式,然後使用 merger BiFunction 合併結果。

示例 - 使用 teeing 收集器獲取 n 個數字的平均值

在這個例子中,我們在 downstream1 收集器中獲取數字的總和,在 downstream2 收集器中獲取數字的計數,然後在合併函式中計算平均值。當我們獲得 的數字並且流的大小不可用時,這很有用。

package com.tutorialspoint;

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      double mean
         = Stream.of(1, 2, 3, 4, 5, 6, 7)
            .collect(Collectors.teeing(
               Collectors.summingDouble(i -> i), Collectors.counting(),
               (sum, n) -> sum / n));

      System.out.println(mean);
   }
}

輸出

讓我們編譯並執行上面的程式,這將產生以下結果:

4.0

示例 - 使用 teeing 收集器獲取學生物件的最低分和最高分

在這個例子中,我們在 downstream1 收集器中獲取學生的最低分,在 downstream2 收集器中獲取學生的最高分。然後使用合併函式,我們建立一個包含具有最低分和最高分的學生的條目的雜湊對映。

package com.tutorialspoint;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

public class Tester {

   public static void main(String args[]) {
      // list of students
      List<Student> students = Arrays.asList(
         new Student(1, "Robert", 390),
         new Student(2, "Julie", 410),
         new Student(3, "John", 440),
         new Student(4, "Michael", 420));

      // collect the result in hashmap
      HashMap<String, Student> result = students.stream().collect(
      // apply the teeing operator
      Collectors.teeing(
         // get the student having highest marks
         Collectors.maxBy(Comparator.comparing(Student::getMarks)),
         // get the student having lowest marks
         Collectors.minBy(Comparator.comparing(Student::getMarks)),
         // put both student entries in the map using merger
         (s1, s2) -> {
            HashMap<String, Student> map = new HashMap<>();
            map.put("Highest", s1.get());
            map.put("Lowest", s2.get());
            return map;
         }
      ));
      System.out.println(result);
   }
}

class Student {
   int rollNo;
   String name;
   int marks;

   public Student(int rollNo, String name, int marks) {
      this.rollNo = rollNo;
      this.name = name;
      this.marks = marks;
   }

   @Override
   public String toString() {
      return "Student [RollNo=" + rollNo + ", Name=" + name + ", Marks=" + marks + "]";
   }

   public int getRollNo() {
      return rollNo;
   }

   public void setRollNo(int rollNo) {
      this.rollNo = rollNo;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public int getMarks() {
      return marks;
   }

   public void setMarks(int marks) {
      this.marks = marks;
   }
}

輸出

讓我們編譯並執行上面的程式,這將產生以下結果:

{Lowest=Student [RollNo=1, Name=Robert, Marks=390], Highest=Student [RollNo=3, Name=John, Marks=440]}
廣告
© . All rights reserved.