**需求:**某个公司的开发部门,分为开发一部和二部,现在需要进行年中数据结算。
分析:
①:员工信息至少包含了(名称、性别、工资、奖金、处罚记录)
②:开发一部有4个员工、开发二部有5名员工
3:分别筛选出2个部门的最高工资的员工信息,封装成优秀员工对象Topperformer
④:分别统计出2个部门的平均月收入,要求去掉最高和最低工资。
⑤:统计2个开发部门整体的平均工资,去掉最低和最高工资的平均值。
package com.itheima.game;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo {
public static double allMoney;
public static double allMoney2;
public static void main(String[] args) {
List<Employee> one = new ArrayList<>();
one.add(new Employee("小高", '男', 30000, 20000, null));
one.add(new Employee("小乖", '女', 25000, 20000, null));
one.add(new Employee("小美", '女', 23000, 200, "顶撞上司"));
one.add(new Employee("小明", '男', 12000, 2000, "迟到"));
List<Employee> two = new ArrayList<>();
two.add(new Employee("小小", '男', 234000, 1000, "迟到"));
two.add(new Employee("小天", '男', 14000, 7000, null));
two.add(new Employee("小领", '男', 12340, 2600, "迟到"));
two.add(new Employee("小吉", '男', 12000, 2000, null));
two.add(new Employee("小太", '男', 12500, 2000, "迟到"));
//1、开发一部门的最高工资的员工
//指定大小规则
Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
.get();
System.out.println(e);
TopPerformer t=one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
.map(e3->new TopPerformer(e.getName(), e.getBonus()+e.getSalary())).get();
System.out.println(t);
//2、统计平均工资,去掉最高工资和最低工资
one.stream().sorted(((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())))
.skip(1).limit(one.size()-2).forEach(e3->{
//求出总和:剩余员工的工资总和
allMoney+=(e.getSalary()+e.getBonus());
});
System.out.println("开发部one的平均工资是:"+allMoney/(one.size()-2));
//3、合并2个集合流,再统计
Stream<Employee> s1=one.stream();
Stream<Employee> s2=two.stream();
Stream<Employee> s3=Stream.concat(s1,s2);
s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
.skip(1).limit(one.size()+two.size()-2).forEach(e4->{
//求出总和:剩余员工的工资总和
allMoney2+=(e.getSalary()+e.getBonus());
});
//精确位数
BigDecimal a=BigDecimal.valueOf(allMoney2);
BigDecimal b=BigDecimal.valueOf((one.size()+two.size()-2));
System.out.println("开发部门的平均工资是:"+a.divide(b,2, RoundingMode.HALF_UP));//保留两位小数四舍五入
}
}