Employee
类和样本数据
- 创建
**Employee**
类,包含相关字段等:
-
id
(整数) -
name
(字符串) -
department
(部门) -
salary
(浮点数) age
(年龄)
- 初始化员工示例数据(例如,使用一个
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() (字符串表示) ...
}
- 示例数据
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. 找到最年长和最年轻员工的方法
根据年龄筛选员工时,可以使用类似 min
和 max
的函数。
// 找到最年长的员工
Employee oldestEmployee = employees.stream()
.max(Comparator.comparingInt(Employee::getAge))
.orElse(null);
System.out.println("最年长的员工是: " + 最年长员工);