我怎样才能得到公司员工的平均工资,他们的工资超过了工资限制?我想首先我需要得到一个所有薪水的列表,并使用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);
}
}
if(salary > salaryLimit){
getAverageSalary();
}
你可以试一下。
你得到的是一个编译器错误,因为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);
平均()
给你一个可选
首先,您正在寻找流。flatMap()
。例如
company.getDepartments().stream()
.flatMap(d -> d.getEmployees().stream()) // ...
它将您的部门流
转换为每个部门的员工流
。然后,您可以map()
将这些映射到薪资,并像之前一样进行筛选。
组合。托利斯()。stream()
毫无意义,因为它需要将一个流转换为另一个提供完全相同对象的流。移除这只会带来好处。
要映射到IntStream
或DoubleStream
,则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
值,比如0
或double。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.