Исключение приведения класса с java .util.function.DoublePredicate - PullRequest
0 голосов
/ 04 августа 2020

Я пишу приложение для развлечения, включающее получение среднего значения из массива и использование DoubleStream и DoublePredicate для фильтрации, а затем подсчет выше и ниже расчетного среднего. Вот код ниже. Почему мой внутренний класс несовместим с DoublePredicate?

ошибка Средняя зарплата сотрудника: 23914.0 Исключение в потоке «main» java .lang.ClassCastException: EmployeeRecord $ GreaterThanSalary несовместимо с java .util.function.DoublePredicate в EmployeeRecordDriver.calculateGreaterThanLessThanSalary (EmployeeRecordDriver. java: 24) в EmployeeRecordDriver.main (EmployeeRecordDriver. java: 13)

1008

1007 *1007* EmployeeRecordDriver. java
import java.util.Arrays;
import java.util.function.DoublePredicate;
import java.util.stream.DoubleStream;   


public class EmployeeRecordDriver {
    
    private static double salary[] = {23500.0, 25080.0, 28760.0, 22340.0, 19890.0};
    private static EmployeeRecord record;
    
    public static void main(String args[]) {
        System.out.println("The average salary of the employee is: " + findAverage(salary));
        System.out.println("The number of employees having a salary greater than the average is: " + calculateGreaterThanLessThanSalary(salary) ); // line 13
//      System.out.println("The number of employees having a salary less than the average is: " + calculateLessThanLessThanSalary(salary) );
    }
    
    public static double findAverage(double[] salary) {
        record = new EmployeeRecord(0.0, salary);
        return record.averageSalary;
    }
        
    public static int calculateGreaterThanLessThanSalary(double salary[]) {
        int info[] = new int[2];
        info[0] = (int)Arrays.asList(salary).stream().flatMapToDouble(element -> DoubleStream.of(element)).filter((DoublePredicate) record.gts).count(); // line 24
        return info[0];
    }
}

EmployeeRecord. java

import java.util.Arrays;
import java.util.function.Predicate;
import java.util.stream.DoubleStream;

public class EmployeeRecord{
    
    double averageSalary = 0.0;
    double[] salary = new double[5];
    GreaterThanSalary<Double> gts = new GreaterThanSalary<>();
    
    public EmployeeRecord(double averageSalary, double[] salary) {
        super();
        this.averageSalary = this.calculateAverage(salary);
        this.salary = salary;
    }

    public double calculateAverage(double salary[]) {
        double sum = Arrays.asList(salary).stream().flatMapToDouble(num -> DoubleStream.of(num)).sum();
        return sum/salary.length;
    }
    
    public class GreaterThanSalary<DoublePredicate> implements Predicate<Double>{
        @Override
        public boolean test(Double d) {
            return d > averageSalary;   
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Избавьтесь от Predicate<Double> и других ненужных дженериков. Для вашего решения (flatMapToDouble производит DoubleStream) требуется DoublePredicate в методе filter. И DoublePredicate отличается от Predicate<Double>. Они не связаны, хотя выглядят почти одинаково.

EmployeeRecord. java:

import java.util.Arrays;
import java.util.function.DoublePredicate;
import java.util.stream.DoubleStream;

public class EmployeeRecord{
    
    double averageSalary = 0.0;
    double[] salary = new double[5];
    DoublePredicate gts = new GreaterThanSalary();
    
    public EmployeeRecord(double averageSalary, double[] salary) {
        super();
        this.averageSalary = this.calculateAverage(salary);
        this.salary = salary;
    }

    public double calculateAverage(double salary[]) {
        double sum = Arrays.asList(salary).stream().flatMapToDouble(num -> DoubleStream.of(num)).sum();
        return sum/salary.length;
    }
    
    public class GreaterThanSalary implements DoublePredicate{
        @Override
        public boolean test(double d) {
            return d > averageSalary;   
        }
    }
}

EmployeeRecordDriver. java:

import java.util.Arrays;
import java.util.function.DoublePredicate;
import java.util.stream.DoubleStream;   


public class EmployeeRecordDriver {
    
    private static double salary[] = {23500.0, 25080.0, 28760.0, 22340.0, 19890.0};
    private static EmployeeRecord record;
    
    public static void main(String args[]) {
        System.out.println("The average salary of the employee is: " + findAverage(salary));
        System.out.println("The number of employees having a salary greater than the average is: " + calculateGreaterThanLessThanSalary(salary) ); // line 13
//      System.out.println("The number of employees having a salary less than the average is: " + calculateLessThanLessThanSalary(salary) );
    }
    
    public static double findAverage(double[] salary) {
        record = new EmployeeRecord(0.0, salary);
        return record.averageSalary;
    }
        
    public static int calculateGreaterThanLessThanSalary(double salary[]) {
        int info[] = new int[2];
        info[0] = (int)Arrays.asList(salary).stream().flatMapToDouble(element -> DoubleStream.of(element)).filter(record.gts).count(); // line 24
        return info[0];
    }
}
0 голосов
/ 05 августа 2020

Спасибо за вклад. Оказывается, мне действительно нужен DoublePredicate. Я нашел это, найдя другой класс, заканчивающийся суффиксом «Predicate» в allclasses-noframe Какая концепция в Java позволяет нам ссылаться на объект, реализующий интерфейс, по типу интерфейса, как в DoublePredicate gts = новый GreaterThanSalary (); ?

EmployeeRecordDriver. java

import java.util.Arrays;
import java.util.function.DoublePredicate;
import java.util.stream.DoubleStream;   


public class EmployeeRecordDriver {
    
    private static double salary[] = {23500.0, 25080.0, 28760.0, 22340.0, 19890.0};
    private static EmployeeRecord record;
    
    public static void main(String args[]) {
        System.out.println("The average salary of the employee is: " + findAverage(salary));
        System.out.println("The number of employees having a salary greater than the average is: " + calculateGreaterThanSalary(salary) );
        System.out.println("The number of employees having a salary less than the average is: " + calculateLessThanSalary(salary) );
    }
    
    public static double findAverage(double[] salary) {
        record = new EmployeeRecord(0.0, salary);
        return record.averageSalary;
    }
        
    public static int calculateGreaterThanSalary(double salary[]) {
        int count = (int)Arrays.stream(salary).filter((DoublePredicate) record.gts).count(); // line 24
        return count;
    }
    
    public static int calculateLessThanSalary(double salary[]) {
        int count = (int)Arrays.stream(salary).filter((DoublePredicate) record.lts).count(); // line 24
        return count;
    }
}

EmployeeRecord. java


import java.util.Arrays;
import java.util.function.DoublePredicate;

public class EmployeeRecord{
    
    double averageSalary = 0.0;
    double[] salary = new double[5];
    DoublePredicate gts = new GreaterThanSalary();
    DoublePredicate lts = new LessThanSalary();
    
    public EmployeeRecord(double averageSalary, double[] salary) {
        this.averageSalary = this.calculateAverage(salary);
        this.salary = salary;
    }

    public double calculateAverage(double salary[]) {
        return Arrays.stream(salary).average().getAsDouble();
    }
    
    public class GreaterThanSalary implements DoublePredicate{
        @Override
        public boolean test(double d) {
            return d > averageSalary;   
        }
    }
    
    public class LessThanSalary implements DoublePredicate{
        @Override
        public boolean test(double d) {
            return d < averageSalary;   
        }
    }
}
0 голосов
/ 04 августа 2020

EmployeeRecord.gts реализует Predicate<Double>, и вы пытаетесь преобразовать его в DoublePredicate. Это похожие, но не идентичные интерфейсы (DoublePredicate использует примитивный тип double, а Predicate<Double> использует бокс).

...