企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 收集器`teeing()`方法示例 > 原文: [https://howtodoinjava.com/java12/collectors-teeing-example/](https://howtodoinjava.com/java12/collectors-teeing-example/) 了解`Collectors.teeing()`方法(在 Java 12 中添加),方法语法以及如何在 Java 的各种用例中应用`teeing()`方法。 ## 1\. `teeing()`的目的 这是`java.util.stream.Collectors`接口的新[静态方法](https://howtodoinjava.com/java/basics/java-static-keyword/),它允许使用两个独立的收集器进行收集,然后使用提供的`BiFunction`合并其结果。 传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将其结果合并为最终结果。 请注意,此函数有助于一步完成特定任务。 如果不使用`teeing()`函数,我们已经可以分两步执行给定的任务。 它只是一个帮助函数,可以帮助减少冗长程度。 ## 2\. 语法 ```java /** * downstream1 - the first downstream collector * downstream2 - the second downstream collector * merger - the function which merges two results into the single one * returns - a Collector which aggregates the results of two supplied collectors. */ public static Collector teeing​ (Collector downstream1, Collector downstream2, BiFunction merger); ``` ## 3\. 使用`teeing()`查找薪水最高和最低的员工 在此`Collectors.teeing()`示例中,我们有一个雇员列表。 我们要一步找到最高薪的员工和最低薪的员工。 以下 Java 程序执行[查找最大和最小](https://howtodoinjava.com/java8/stream-max-min-examples/)操作,然后将两个项目收集到`Map`中。 ```java import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.HashMap; import java.util.Optional; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Employee> employeeList = Arrays.asList( new Employee(1, "A", 100), new Employee(2, "B", 200), new Employee(3, "C", 300), new Employee(4, "D", 400)); HashMap<String, Employee> result = employeeList.stream().collect( Collectors.teeing( Collectors.maxBy(Comparator.comparing(Employee::getSalary)), Collectors.minBy(Comparator.comparing(Employee::getSalary)), (e1, e2) -> { HashMap<String, Employee> map = new HashMap(); map.put("MAX", e1.get()); map.put("MIN", e2.get()); return map; } )); System.out.println(result); } } ``` 程序输出。 ```java C:\BAML\DFCCUI\installs\jdk-12.0.1\bin>java Main.java { MIN=Employee [id=1, name=A, salary=100.0], MAX=Employee [id=4, name=D, salary=400.0] } ``` 这里的`Employee`类是这样的。 ```java class Employee { private long id; private String name; private double salary; public Employee(long id, String name, double salary) { super(); this.id = id; this.name = name; this.salary = salary; } //Getters and setters @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]"; } } ``` ## 4\. 使用`teeing()`过滤项目并计数 在此示例中,我们将使用同一组员工。 在这里,我们将找到所有薪水高于 200 的员工,然后我们还将计算这些员工的数量。 ```java import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.HashMap; import java.util.Optional; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Employee> employeeList = Arrays.asList( new Employee(1, "A", 100), new Employee(2, "B", 200), new Employee(3, "C", 300), new Employee(4, "D", 400)); HashMap<String, Object> result = employeeList.stream().collect( Collectors.teeing( Collectors.filtering(e -> e.getSalary() > 200, Collectors.toList()), Collectors.filtering(e -> e.getSalary() > 200, Collectors.counting()), (list, count) -> { HashMap<String, Object> map = new HashMap(); map.put("list", list); map.put("count", count); return map; } )); System.out.println(result); } } ``` 程序输出: ```java C:\BAML\DFCCUI\installs\jdk-12.0.1\bin>java Main.java { count=2, list=[Employee [id=3, name=C, salary=300.0], Employee [id=4, name=D, salary=400.0]] } ``` ## 5\. 总结 上面的`Collectors.teeing()`方法示例非常简单,为便于基本理解而编写。 您需要使用非常适合您自己需要的函数。 只需记住,当您需要执行两次流操作并在两个不同的收集器中收集结果时,请考虑使用`teeing()`方法。 它并不总是适合用例,但适合时可能会有用。 学习愉快! 参考: [Java 文档](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/stream/Collectors.html#teeing(java.util.stream.Collector,java.util.stream.Collector,java.util.function.BiFunction))