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]}
广告