行业资讯 2025年08月6日
0 收藏 0 点赞 819 浏览 2593 个字
摘要 :

文章目录 1.teeing collector的目的 2.语法. 3. 使用 teeing()查找薪水最高的员工和薪水最低的员工 4.使用 teeing() 过滤项目并计算它们 5.结论 学习 Collectors.teein……




  • 1.teeing collector的目的
  • 2.语法.
  • 3. 使用 teeing()查找薪水最高的员工和薪水最低的员工
  • 4.使用 teeing() 过滤项目并计算它们
  • 5.结论

学习 Collectors.teeing() 方法(在Java 12中新增),方法语法以及如何在Java中的各种用例中应用teeing()方法。

1.teeing collector的目的

teeing是java.util.stream.Collectors接口中的新静态方法,允许使用两个独立的收集器进行收集,然后使用指定的BiFunction合并结果。

传递给结果收集器的每个元素都由两个下游收集器进行处理,然后使用指定的合并函数将它们的结果合并为最终结果。

请注意,此函数有助于分单个步骤执行特定任务。如果我们不使用teeing()函数,我们可以在两个步骤中执行给定的任务。它只是一种辅助函数,可以帮助减少代码冗余。

2.语法.

/**
* downstream1 - 第一个下游收集器
* downstream2 - 第二个下游收集器
* merger - 将两个结果合并成一个单一结果的函数
 
* returns - 聚合两个提供收集器结果的Collector。
*/
 
public static Collector teeing​ (Collector downstream1, 
                Collector downstream2, 
                BiFunction merger);

3. 使用 teeing()查找薪水最高的员工和薪水最低的员工

在这个 Collectors.teeing() 示例中,我们有一组员工。我们希望在单个步骤中找出薪水最高的员工和薪水最低的员工。

以下java程序执行查找最大和最小操作,然后将两个项收集到Map中。

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);
  }
}

程序输出:

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类如下所示。

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的所有员工,然后我们还会计算这样的员工人数。

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);
  }
}

程序输出:

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()方法。它并不总是适合用例,但在适合时可能会很有用。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9588.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号