手记

Java 中 Stream API 的实战运用:玩转员工数据处理

步骤 1:定义 Employee 类和样本数据
  1. 创建**Employee**,包含相关字段等:
  • id (整数)

  • name (字符串)

  • department (部门)

  • salary (浮点数)

  • age (年龄)
  1. 初始化员工示例数据(例如,使用一个 Employee 对象的列表)。
    import java.util.*;  
    import java.util.stream.Collectors;
    // 引入Java.util包和stream.Collectors工具,用于后续操作
    class 员工 {  
        private int id;  
        private String 姓名;  
        private String 部门;  
        private double 薪水;  
        private int 年龄;    // 构造器, 获取器, 设置器, toString() (字符串表示) ...  
    }
  1. 示例数据
List<Employee> employees = Arrays.asList(  
    new Employee(1, "Alice", "HR", 55000, 28),  
    new Employee(2, "Bob", "IT", 70000, 32),  
    new Employee(3, "Charlie", "Finance", 80000, 45),  
    new Employee(4, "David", "IT", 65000, 26),  
    new Employee(5, "Eve", "HR", 72000, 41)  
);
第二步:流式API编码主题和示例

以下是几个关键的流API概念以及示例操作:

1. 基于条件筛选员工

按薪资、部门或年龄等条件过滤员工。

    // 找出薪水超过60000的员工
    List<Employee> 高薪员工 = employees.stream()
        .filter(e -> e.getSalary() > 60000)
        .collect(Collectors.toList());
    System.out.println("高薪员工名单: " + 高薪员工);
2. 员工排序.

按薪水或年龄排员工

    // 根据薪水升序排列员工  
    List<Employee> sortedBySalary = employees.stream()  
        .sorted(Comparator.comparingDouble(Employee::getSalary))  
        .collect(Collectors.toList());  
    System.out.println("根据薪水升序排列的员工: " + sortedBySalary);
三、员工姓名映射

比如,你可以用 map 来提取所有员工的名字。

    // 获取员工的名字列表
    从员工列表中
        .map(Employee::getName) // 获取每个员工的名字
        .collect(Collectors.toList()); // 收集到一个列表中
    打印("员工的名字是:" + employeeNames);
4. 计算求和、平均数、最小值和最大值.

可以对像工资这样的数值型字段进行计算。

    // 计算总的工资
    double totalSalary = employees.stream()
        .mapToDouble(Employee::getSalary)
        .sum();
    System.out.println("打印输出总工资: " + totalSalary);

    // 计算平均的工资
    double averageSalary = employees.stream()
        .mapToDouble(Employee::getSalary)
        .average()
        .orElse(0.0);
    System.out.println("打印输出平均工资: " + averageSalary);

    // 找到工资最高的员工
    Employee highestEarner = employees.stream()
        .max(Comparator.comparingDouble(Employee::getSalary))
        .orElse(null);
    System.out.println("工资最高的人: " + highestEarner);
5. 将员工按部门分组

按部门将员工分组。

    // 按部门分组员工们
    employees流().收集(Collectors分组(Employee::getDepartment));  
    打印("按部门的员工们: " + employeesByDepartment);
6. 基于薪水的员工分组

根据薪资条件将员工分成几部分。

    // 根据年薪大于65000元将员工分组  
    Map<Boolean, List<Employee>> partitionedBySalary = employees.stream()  
        .collect(Collectors.partitioningBy(e -> e.getSalary() > 65000));  
    System.out.println("年薪大于65000元的员工分组结果:" + partitionedBySalary);
7. 各部门员工数统计

统计每个部门的员工人数。

    // 统计每个部门的员工人数
    Map<String, Long> countByDepartment = employees.stream()
        .collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting()));
    System.out.println("按部门统计人数: " + countByDepartment);
8. 检查所有、任一或无情况

检查员工是否全部、部分或没有任何一个人符合某个条件。

    // 检查所有员工的工资是否都超过50000  
    boolean allHighSalary = employees.stream()  
        .allMatch(e -> e.getSalary() > 50000);  
    System.out.println("所有员工的工资都超过50000: " + allHighSalary);  

    // 检查是否有员工在HR  
    boolean anyInHR = employees.stream()  
        .anyMatch(e -> e.getDepartment().equals("HR"));  
    System.out.println("有员工在HR: " + anyInHR);
9. 计算总和与自定义聚合

你可以使用 reduce 函数来找到最大值或求和,比如求和或找到最大值。

    // 使用 reduce 方法计算工资总额
    double sumSalaries = employees.stream()
        .map(Employee::getSalary)
        .reduce(0.0, Double::sum);
    System.out.println("工资总额 (reduce 方法): " + sumSalaries);
十. 创建自定义收集工具

如果需要的话,可以创建自定义收集器,例如将所有员工姓名收集到一个字符串里。

    // 将所有员工的名字拼接成一个字符串  
    String 拼接的名字 = employees流  
        .map(Employee::getName)  
        .collect(Collectors.joining(", "));  
    打印("这些名字拼接起来就是: " + 拼接的名字);
11. 找到最年长和最年轻员工的方法

根据年龄筛选员工时,可以使用类似 minmax 的函数。

    // 找到最年长的员工  
    Employee oldestEmployee = employees.stream()  
        .max(Comparator.comparingInt(Employee::getAge))  
        .orElse(null);  
    System.out.println("最年长的员工是: " + 最年长员工);
0人推荐
随时随地看视频
慕课网APP