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

为不同类型的员工实现不同的谓词

沈飞翔
2023-03-14

我是使用谓词的新手,不确定我是否正确理解了它。我有一个抽象的员工类,其中每小时和薪水员工是分开创建的。我的问题依赖于我的员工redicate.java类,我不确定如何检查它是否是每小时员工并返回真或假。

我需要为以下所有条件创建不同的谓词:

所有员工,仅每小时一次,仅限工资和全职。

到目前为止,我只是想先让“仅每小时”谓词正常工作,然后再找出剩下的谓词。我不确定在“p”后面加什么来检查它是哪种类型的员工。我目前拥有的是:

public static Predicate<Employee> isHourlyEmployee() {
        return p -> p.
    }

我还有一条语句,即double avgSalary=calculateAveragePay(employees,null)和我不确定用什么来替换null,因为它应该是基于上面main中我的calculateAveragePay函数的谓词。

主要的Java语言

package homework04;

import java.util.function.Predicate;

public class Main {

public static double calculateAveragePay(Employee[] employees, Predicate<Employee> pred) {
    double sum = 0.0;
    int count = 0;
    for(Employee e : employees) {
        if(!pred.test(e)) {             
            continue;
        }
        sum += e.calculatePay();
        count++;
    }
    return sum / count;
}

public static void main(String[] args) {
    //The list of employees to calculate.
    Employee[] employees = {
        new HourlyEmployee("John Smith", 80, 18.00),
        new HourlyEmployee("Jane Doe", 77, 20.00),
        new SalaryEmployee("Bob Miller", 85, 40000.00),
        new HourlyEmployee("Alice Davis", 40, 12.50),
        new SalaryEmployee("Frank Frink", 70, 35000.00),
        new HourlyEmployee("Chris Williams", 95, 25.00)
    };

    //The average pay for both types of employee.
    double avgSalary = calculateAveragePay(employees, null);
    double avgHourly = calculateAveragePay(employees, null);

    //The bonus to be added to employee pay.
    //double bonus = Math.abs(avgSalary - avgHourly);

    //Print the average pay
    System.out.println("===== Average Pay =====");

}

}

Employee.java

package homework04;

import java.util.function.Predicate;

abstract class Employee {

    private String name;
    private int hoursWorked;

    public Employee(String name, int hoursWorked) {
        this.name = name;
        this.hoursWorked = hoursWorked;
    }

    public int getHoursWorked() {
        return hoursWorked;
    }

    public String getName() {
        return name;
    }

    public abstract double calculatePay();

}

小时mployee.java

package homework04;

public class HourlyEmployee extends Employee {

    private double hourlyPay;

    public HourlyEmployee(String name, int hoursWorked, double hourlyPay) {
        super(name, hoursWorked);
        this.hourlyPay = hourlyPay;
    }

    @Override
    public double calculatePay() {
        return getHoursWorked() * hourlyPay;
    }

}

工薪员工。Java语言

package homework04;

public class SalaryEmployee extends Employee {

    private static final int NUM_PAY_PERIODS = 26;

    private double salary;

    public SalaryEmployee(String name, int hoursWorked, double salary) {
        super(name, hoursWorked);
        this.salary = salary;
    }

    @Override
    public double calculatePay() {
        return salary / NUM_PAY_PERIODS;
    }

}

员工预测。Java语言

package homework04;

import java.util.function.Predicate;

public class EmployeePredicate {

    public static Predicate<Employee> isHourlyEmployee() {
        return p -> p.
    }

}

共有1个答案

颛孙兴旺
2023-03-14

您正在寻找:

 return p -> p instanceof HourlyEmployee;

但我不建议在工厂类中为每个类型的员工创建谓词,而是在调用calculateAveragePay方法时传入行为,即。

double avgSalary = calculateAveragePay(employees, p -> p instanceof SalaryEmployee);
double avgHourly = calculateAveragePay(employees, p -> p instanceof HourlyEmployee);

然而,如果您想继续使用谓词方法的工厂类,因为您觉得它提供了更好的可读性,那么您可以执行以下操作:

public class EmployeePredicate {
    public static Predicate<Employee> isHourlyEmployee() {
        return p -> p instanceof HourlyEmployee;
    }
}

然后该方法调用calculateAveragePay成为:

double avgSalary = calculateAveragePay(employees, EmployeePredicate.isSalaryEmployee()); // create the isSalaryEmployee method
double avgHourly = calculateAveragePay(employees, EmployeePredicate.isHourlyEmployee());

另一方面,您可以使用流API执行calculateAveragePay,使其更具可读性。

public static double calculateAveragePay(Employee[] employees, Predicate<Employee> pred) {
    return Arrays.stream(employees)
                 .filter(pred)
                 .mapToDouble(e -> e.calculatePay()) 
                 .average().orElse(0);
}
 类似资料:
  • 企业中不同职位、不同职级、不同场景下都会有不同的用车制度,系统支持按照不同场景配置制度,并且支持每个员工拥有不同制度。 配置方法 1、单个员工配置 选择需要配置员工 选择该员工适用的企业支付制度 2、批量配置 批量为员工匹配制度有两种方式: 在界面中直接操作和上传员工的手机号码进行编辑。 ①在界面中直接操作 从界面中筛选出需要操作的员工,点击编辑  对选定的员工设置权限 可对选中的员工进行增加、移

  • 对于下面的代码,我得到了不同的输出 输出为: 现在美国/洛杉矶是GMT-8/UTC-8或PST。但当我将参数从GMT-8改为America/Los_Angeles时, 输出为: 不能使用类似PST的缩写,因为它已被弃用。同时,CST可以指中央标准时间和中国标准时间。 我的输入是-8、-9-14等,我希望在GMT/UTC之前知道我是否可以在给定日期获得DST激活。 请在这方面指导我。

  • 想象一下下面的scanario:我有一个程序,它要求输入一个整数,然后是一个String输入。 根据aobe代码,我没有机会输入姓名。因此,通常我会声明2个扫描仪对象,如下所示: 我的问题是:有必要声明多个扫描仪对象来接受不同类型的输入吗??我这样做是正确的吗? 我已经考虑这个问题很多年了。(SO中的几个问题提到了多扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天问这个问题。)

  • 假设我有一个抽象类Product,我还有两个实体用不同的字段扩展它:ProductA和ProductB。我正在使用Product repository,使用Specification和SpecificationBuilder,并使用一些常用字段来搜索它们。我想完成的是检测它是什么类型的产品(A或B),并在此基础上使用不同的搜索查询。 例如,ProductA有库存,ProductB有功能,因此如果我

  • 我需要编写一个java方法来从一个对象中获取特定的信息。但是,该对象可以是A类型的,也可以是B类型的。下面是我的代码的一部分: 当我这样写它时,它会引发一个错误,说“重复方法”。我怎么才能让这个起作用?

  • 我总共有三个活动,我正在为每个活动实现admob,每个活动都有自己的横幅,当活动被改变时,另一个活动挂了一点,因为广告加载在后台,是否有任何方法,一个横幅出现在所有活动时,切换,以避免延迟。