当前位置: 首页 > 知识库问答 >
问题:

使用Java stream api获得平均工资;

拓拔弘化
2023-03-14

我怎样才能得到公司员工的平均工资,他们的工资超过了工资限制?我想首先我需要得到一个所有薪水的列表,并使用mapToInt和average进行筛选,但是。。。什么都不管用((

public class TestCl {

@Data
@AllArgsConstructor
public class Company {
    private List<Department> departments;
}

@Data
@AllArgsConstructor
public class Department {
    private List<Employee> employees;
}

@Data
@AllArgsConstructor
public class Employee {
    private int salary;
}

@Test
public void test() {
    int salaryLimit = 25;

    List<Employee> employees = new ArrayList<>(){{
        add(new Employee(10));
        add(new Employee(20));
        add(new Employee(30));
        add(new Employee(40));
        add(new Employee(50));
    }};

    List<Department> departments = new ArrayList<>(){{
        add(new Department(employees));
        add(new Department(employees));
        add(new Department(employees));
        add(new Department(employees));
        add(new Department(employees));
    }};

    Company company = new Company(departments);

    float average = company.getDepartments().stream()
            .map(Department::getEmployees).toList().stream()
            .map(Employee::getSalary).toList().stream()
            .filter(x -> x >= salaryLimit).mapToInt().average();

    System.out.println(average);
}

}

共有3个答案

傅丁雷
2023-03-14
if(salary > salaryLimit){
   getAverageSalary();
}

你可以试一下。

晋承运
2023-03-14

你得到的是一个编译器错误,因为mapToInt需要一个ToIntFunction,但是你没有提供。

此外,您不需要将流收集到列表中,只需要再次将其转换为流。只要不调用终端方法,您仍然可以使用流。

所以你可以这样做:

double average = company.getDepartments().stream()
        .flatMap(department -> department.getEmployees().stream())
        .map(Employee::getSalary)
        .filter(x -> x >= salaryLimit)
        .mapToDouble(salary -> salary)
        .average()
        .orElse(0.0);

平均()给你一个可选

俞俊逸
2023-03-14

首先,您正在寻找流。flatMap()。例如

company.getDepartments().stream()
            .flatMap(d -> d.getEmployees().stream()) // ...

它将您的部门流转换为每个部门的员工流。然后,您可以map()将这些映射到薪资,并像之前一样进行筛选。

组合。托利斯()。stream()毫无意义,因为它需要将一个流转换为另一个提供完全相同对象的流。移除这只会带来好处。

要映射到IntStreamDoubleStream,则mapToInt()mapToDouble()方法需要一个函数来表示映射的细节,您可以省略该函数。

最后,IntStream。average()双流。average(),etc返回一个OptionalInteger/OptionalDouble/etc,它考虑到由于流提供零元素而不存在平均值的可能性。你需要解决这个问题。

总之,那么:

float average = company.getDepartments().stream() // a stream of Departments
        .flatMap(d -> d.getEmployees().stream())  // a stream of Employees
        .map(e -> e.getSalary())                  // a stream of Integer salaries
        .filter(s -> s.intValue() >= salaryLimit) // only the high salaries
        .mapToDouble(Integer::doubleValue)        // as a DoubleStream
        .average()                                // reduce to an average
        .getAsDouble();                           // the value, if it exists

请注意,getAsDouble()如果没有满足筛选条件的薪资,则会抛出NoTouchElementException。捕捉和处理这是处理这种情况的一种非常合理的方法,但是如果您想避免这种情况,那么您可以存储average()的结果,而不是链接getAsDouble(),然后用isPresent()测试它,以决定是继续使用getAsDouble()还是以不同的方式处理这种情况。或者如果在这种情况下有一个特定的double值,比如0double。NaN——然后你可以在orElse(ValueForZeroSales)而不是getAsDouble()上链接。

 类似资料:
  • 我不能得到熊猫的平均值或平均值。有一个数据框。下面我尝试的东西都没有给我列的平均值 以下内容返回多个值,而不是一个值: 这也是:

  • 问题内容: 我需要获得fname,lname,比平均工资低400.00美元的员工薪水,即使在加薪10%之后。 我能够使薪水低于平均薪水的员工,但不确定如何使加薪后的薪水低于400美元的员工。 我正在使用MySQL。谢谢你。 这给了我工资低于平均工资的员工: 我当时在想这样的事情,但这是行不通的。未知专栏新闻: 问题答案: 您有一个正确的想法,就是不能在这样的子句中使用别名。只需直接使用公式,就可以

  • 问题内容: 我的表中有一列具有FLOAT类型的值。如何获得此列中所有元素的平均值? 问题答案: 这将平均所有行。要平均子集,请使用子句。要平均每个组(某物),请使用by子句。

  • 问题内容: 我希望能够拍摄图像并找出平均颜色是多少。意思是如果图像是半黑半白,我会在两者之间得到一些…灰色阴影。它可能是最常见的单色或中间值。任何平均值都可以。 我该如何在android中做到这一点。 问题答案:

  • 问题内容: 我无法获得熊猫列的平均值或均值。有一个数据框。我在下面尝试的任何事情都没有给我该列的平均值 以下返回几个值,而不是一个: 这样: 问题答案: 如果您只想要列的均值,请选择列(这是一个系列),然后调用:

  • 基于线程:Spring Data JPA-结果中带有多个聚合函数的自定义查询 我的jpa存储库中有这个查询 并且在我的pojo构造函数中是: 但我有这个错误: 创建名为“Averages Repository”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:对方法public abstract mx.com.sk.pojos.