• Stream流中的 max()和 sorted()方法


    • 需求:某个公司的开发部门,分为开发 一部 和 二部 ,现在需要进行年中数据结算。分析:
    1. 员工信息至少包含了(名称、性别、工资、奖金、处罚记录)
    2. 开发一部有 4 个员工、开发二部有 5 名员工
    3. 分别筛选出 2 个部门的最高工资的员工信息,封装成优秀员工对象Topperformer
    4. 分别统计出 2 个部门的平均月收入,要求去掉最高和最低工资
    5. 统计 2 个开发部门整体的平均工资,去掉最低和最高工资的平均值
    • 根据提供的Comparator返回此流的 最大元素
    • 返回由此流的元素组成的流,根据Comparator进行排序
    1. package com.csdn.streampractice;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import java.math.BigDecimal;
    6. import java.math.RoundingMode;
    7. import java.util.*;
    8. import java.util.function.Consumer;
    9. import java.util.stream.Stream;
    10. public class StreamDemo04 {
    11. private static double allMoney; //开发一部去掉最高工资,最低工资的总和
    12. private static double allMoney2;// 2个部门去掉最高工资,最低工资的总和
    13. private static double averageTwo;//开发二部去掉最高工资,最低工资的总和
    14. public static void main(String[] args) {
    15. //开发一部
    16. List one = new ArrayList<>();
    17. Collections.addAll(one, new Employee("张三丰", '男', 30000, 25000, null),
    18. new Employee("张翠山", '男', 25000, 1000, "顶撞上司"),
    19. new Employee("张无忌", '男', 20000, 20000, null),
    20. new Employee("赵敏", '女', 20000, 25000, null));
    21. //1.筛选出开发一部的最高工资的员工信息
    22. // Optional optional= one.stream().max(new Comparator() {
    23. // @Override
    24. // public int compare(Employee o1, Employee o2) {
    25. // return Double.compare(o1.getSalary() + o1.getBonus(), o2.getSalary() + o2.getBonus());
    26. // }
    27. // });
    28. // Employee employee = optional.get();
    29. // System.out.println(employee);
    30. // Optional optional = one.stream().max((o1, o2) -> Double.compare(o1.getSalary() + o1.getBonus(), o2.getSalary() + o2.getBonus()));
    31. // Employee employee = optional.get();
    32. // System.out.println(employee);
    33. Optional optional = one.stream().max(Comparator.comparingDouble(o -> o.getSalary() + o.getBonus()));
    34. Employee employee = optional.get();
    35. System.out.println(employee);//Employee(name=张三丰, sex=男, salary=30000.0, bonus=25000.0, punish=null)
    36. //2.封装成优秀员工对象TopperFormer
    37. Optional topperFormer = optional.map(e -> new TopperFormer(e.getName(), e.getSalary() + e.getBonus()));
    38. TopperFormer topperFormer1 = topperFormer.get();
    39. System.out.println(topperFormer1);//TopperFormer(name=张三丰, money=55000.0)
    40. //3.统计平均工资,去掉最高工资和最低工资
    41. one.stream().sorted(Comparator.comparingDouble(o -> o.getSalary() + o.getBonus())).skip(1).
    42. limit(one.size() - 2).forEach(new Consumer() {
    43. @Override
    44. public void accept(Employee employee) {
    45. allMoney += (employee.getSalary() + employee.getBonus());
    46. }
    47. });
    48. System.out.println("开发一部的平均工资是:" + allMoney / (one.size() - 2));//开发一部的平均工资是:42500.0
    49. //开发二部
    50. List two = new ArrayList<>();
    51. Collections.addAll(two, new Employee("喜羊羊", '男', 15000, 9000, null),
    52. new Employee("美羊羊", '女', 20000, 10000, null),
    53. new Employee("懒洋洋", '女', 50000, 100000, "被打"),
    54. new Employee("灰太狼", '男', 3500, 1000, "被打"),
    55. new Employee("红太狼", '女', 20000, 0, "下毒"));
    56. //1.筛选出开发二部的最高工资的员工信息
    57. Optional optional2 = two.stream().max(Comparator.comparingDouble(o -> o.getSalary() + o.getBonus()));
    58. Employee employee2 = optional2.get();
    59. System.out.println(employee2);//Employee(name=懒洋洋, sex=女, salary=50000.0, bonus=100000.0, punish=被打)
    60. //2.封装成优秀员工对象TopperFormer
    61. Optional topperFormer2 = optional2.map(e -> new TopperFormer(e.getName(), e.getSalary() + e.getBonus()));
    62. TopperFormer topperFormer3 = topperFormer2.get();
    63. System.out.println(topperFormer3);//TopperFormer(name=懒洋洋, money=150000.0)
    64. //3.统计平均工资,去掉最高工资和最低工资
    65. two.stream().sorted(Comparator.comparingDouble(o -> o.getSalary() + o.getBonus())).skip(1).
    66. limit(two.size()-2).forEach(new Consumer() {
    67. @Override
    68. public void accept(Employee employee) {
    69. averageTwo += (employee.getSalary() + employee.getBonus());
    70. }
    71. });
    72. System.out.println("开发二部的平均工资是:" + averageTwo / (two.size() - 2));//开发二部的平均工资是:24666.666666666668
    73. //4.统计 2 个开发部门整体的平均工资,去掉最低和最高工资的平均值
    74. Stream s1 = one.stream();
    75. Stream s2 = two.stream();
    76. Stream s3 = Stream.concat(s1, s2);
    77. s3.sorted(Comparator.comparingDouble(o -> o.getSalary() + o.getBonus())).
    78. skip(1).limit(one.size() + two.size() - 2).forEach(employee1 -> {
    79. allMoney2 += (employee1.getSalary() + employee1.getBonus());
    80. });
    81. //BigDecimal
    82. BigDecimal a = BigDecimal.valueOf(allMoney2);
    83. BigDecimal b = BigDecimal.valueOf(one.size() + two.size() - 2);
    84. System.out.println("开发部的平均工资是:" + a.divide(b,2, RoundingMode.HALF_UP));//开发部的平均工资是:34285.71
    85. }
    86. }
    87. @Data
    88. @NoArgsConstructor
    89. @AllArgsConstructor
    90. class Employee {
    91. private String name;
    92. private char sex;
    93. private double salary;
    94. private double bonus;
    95. private String punish;//处罚信息
    96. }
    97. @Data
    98. @NoArgsConstructor
    99. @AllArgsConstructor
    100. class TopperFormer {
    101. private String name;
    102. private double money;
    103. }
    1. package com.csdn.Stream2;
    2. import java.util.ArrayList;
    3. import java.util.Collections;
    4. import java.util.Comparator;
    5. public class StreamSorted {
    6. public static void main(String[] args) {
    7. ArrayList list = new ArrayList();
    8. Collections.addAll(list, "eee", "dd", "ccc", "bb", "aaa");
    9. //按照字母顺序把数据在控制台输出
    10. list.stream().sorted().forEach(System.out::println);
    11. // aaa
    12. // bb
    13. // ccc
    14. // dd
    15. // eee
    16. System.out.println("============");
    17. //按照字符串长度升序排序,如果长度相等,在按照字母顺序排序
    18. list.stream().sorted(new Comparator() {
    19. @Override
    20. public int compare(String o1, String o2) {
    21. //按照字符串长度排序
    22. int num = o1.length() - o2.length();
    23. //如果字符串长度相等,按照字母顺序排序,如果字符串长度不相等,按照字符串长度升序排序
    24. int num2 = num == 0 ? o1.compareTo(o2) : num;
    25. return num2;
    26. }
    27. }).forEach(System.out::println);
    28. // bb
    29. // dd
    30. // aaa
    31. // ccc
    32. // eee
    33. }
    34. }

  • 相关阅读:
    驾校管理系统的设计与实现/驾校信息管理系统
    【高效办公】一、ubuntu之间共享桌面
    分布式一致性协议
    设计模式——状态模式
    Dobbo微服务项目实战(详细介绍+案例源码) - 1.项目介绍及环境配置
    国外芯片,为什么有中文资料和网页?
    `英语` 2022/8/18
    【微信h5】获取用户openid:基于vue3+springBoot
    功能测试想进阶,可以提供一点点思路和方向吗?
    最短编辑距离( 动态规划 + 线性dp )
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133846735