2
votes

The task was:

Modify bonuses for all workers whose name starts with a letter from the second half of the alphabet.

class Worker that extends Employee
{
    public Worker(String name, int yOfEmp, int salary, Manager boss){
        super(name, yOfEmp, salary,boss);
        boss.addEmployee(this);
    }

    public float getBonus(Employee emp){
        Random rand = new Random();
        float proc = rand.nextFloat();
        return emp.getSalary() * proc;
    }
    public float setBonus(Employee e, float proc){
        float newProc = proc;
        return e.getSalary() * proc;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}

class RegWorker extends Worker
{
}

class Main
{
  public static void main(String[] str) {
    Manager bill = new Manager("Bill", 2010, 2549, null);
    Manager steven = new Manager("Steven", 2011, 2100, bill);
    Trainer jerry = new Trainer("Jerry", 2014, 800, steven);
    RegWorker john = new RegWorker("John", 2010, 1000, bill);
    RegWorker kate = new RegWorker("Kate", 2011, 1000, bill);
    RegWorker sam = new RegWorker("Sam", 2013, 1200, steven);

    final List<Worker> workers = Arrays.asList(jerry, john, kate, sam);

    System.out.println("Modify bonuses for all regular workers:");
    RegWorker reg = null;

    List<RegWorker> regWorkers = workers
                .stream()
                .filter(w -> w.getClass() == reg.getClass())
                .filter(w -> w.getName().charAt(0) < 'O')
                .map(w -> w.setBonus(w, w.getBonus(w)+3))
                .collect(toList());
    }

I've got this error

reason: inference variable T has incompatible bounds
equality constraints: RegWorker
lower bounds: Float

1
There's too much code and it is also quite weird: reg.getClass() is guaranteed to fail with NullPointerException. - Tunaki

1 Answers

3
votes

When you're doing map, you replace stream objects with mapper function return value which is return value of setBonus, which is float. So after the map step you have not Stream<RegWorker>, but Stream<Float> which should be collected into List<Float>.

It seems that you want to use peek instead of map. Also you will need to cast stream elements to RegWorker class as your original stream is Stream<Worker>. Finally note that your code has another problem which will appear in runtime: reg.getClass() will throw NullPointerException as reg is null. Probably you just need .filter(w -> w instanceof RegWorker):

List<RegWorker> regWorkers = workers
            .stream()
            .filter(w -> w instanceof RegWorker)
            .filter(w -> w.getName().charAt(0) < 'O')
            .map(w -> (RegWorker)w)
            .peek(w -> w.setBonus(w, w.getBonus(w)+3))
            .collect(toList());