ew Employee("武松",'男',15000,9000,null));
two.add(new Employee("李逵",'男',25000,10000,null));
two.add(new Employee("西门庆",'男',50000,10000,"迟到"));
two.add(new Employee("潘金莲",'女',3500,1000,"打人"));
two.add(new Employee("武大郎",'女',20000,0,"偷窃"));
// 1、开发1部的最高工资的员工
//指定大小规则
// Employee employee = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
// .get();
Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
.map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
System.out.println(t);
// 3-2、开发2部的最高工资信息
// 1)先用max定义规则,比较大小;2)用map进行加工
Topperformer topperformer = two.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
.map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
System.out.println(topperformer);
// 不能在main方法中定义一个局部变量供main方法中的foreach循环使用。
// 因为main方法和foreach属于不同的方法栈,在不同的栈里面跑,互相不能访问。
// 解决办法:共享变量:所有变量都可以访问,属于类
// 2、统计平均工资,去掉最高工资和最低工资 e1在前就是升序,e2在前就是降序
one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).
skip(1).limit(one.size()-2).forEach(e->{
//求出总和:剩余员工的工资总和
allMoney += e.getBonus()+e.getSalary();
});
System.out.println("开发1部的平均工资是" +allMoney/(one.size()-2));
// 4-2、开发2部的平均月收入,去掉最高和最低工资。
two.stream().sorted((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus()))
.skip(1).limit(two.size()-2).forEach(employee -> {
allMoney2 += employee.getSalary()+employee.getBonus();
});
System.out.println("开发2的平均月收入是"+allMoney2);
// 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(e ->{
allMoney3 += e.getSalary()+e.getBonus();
});
BigDecimal a = BigDecimal.valueOf(allMoney3);
BigDecimal b = BigDecimal.valueOf(one.size()+ two.size()-2);
System.out.println("2个部门的整体平均工资是" +a.divide(b,2, RoundingMode.HALF_UP));
}
}
5 Stream流的收集操作
- 收集Stream流的含义:把Stream流操作后的结果数据转回到集合或者数组中去。流只能使用一次。
- Stream流:方便操作集合/数组的手段。
- 集合/数组:才是开发中的目的。
Stream<String> s1 = list.stream().filter(s ->
s.startsWith("张")
);
//List<String> list1 = s1.toList(); //得到不可变集合
List<String> zhangList = s1.collect(Collectors.toList());
Stream<String> s2 = list.stream().filter(s ->
s.startsWith("张")
);
Set<String> zhangList2 = s2.collect(Collectors.toSet());
Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
// Stream<String>转换成数组时,默认转换成Object形式
// Object[] arrs = s3.toArray();
// 如果非要把object类型转为String类型
String[] arrs = s3.toArray(s->new String[s]);
// String[] arrs2 = s3.toArray(String[]::new);
System.out.println(arrs); //输出数组的地址
|