Отправка списка различных объектов и возврат суммы их свойств

Мне нужно на занятия

public class Consumer{


private String name;
private int salary;


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getSalary() {
    return salary;
}

public void setSalary(int salary) {
    this.salary = salary;
}
}

и далее

public class Donor {

private String name;
private int amount;
private String location;



public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAmount() {
    return amount;
}

public void setAmount(int amount) {
    this.amount = amount;
}
}

теперь у меня есть другой класс, который содержит метод method1 ()

public class GenericClass<T> {

    public void method1(List<T> list){

        Iterator i = list.iterator();

        while (i.hasNext()){

        }
    }


}

и мой основной метод

public class MainMethod {

    public static void main(String[] args) {
        List<Donor> d = new ArrayList<>();


        Donor donor = new Donor();
        donor.setAmount(500);
        donor.setName("bill");


        Donor donor1 = new Donor();
        donor.setAmount(1250);
        donor.setName("linda");

        d.add(donor);
        d.add(donor1);


        GenericClass genericClass = new GenericClass();
        genericClass.method1(d);
    }




}

Я хочу сделать этот метод1 () динамическим и вернуть динамический результат.

Итак, если я отправлю список Потребителей, он должен вернуть мне сумму всех зарплат, а если я пришлю список Доноров, он должен отправить мне сумму пожертвованной суммы?

как этого добиться?

Возможный дубликат Как вызвать метод объекта универсального типа?

Loris Securo 06.09.2018 17:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вы, вероятно, сделаете не класс GenericClass универсальным, а метод method1().

Затем вы можете предоставить ToIntFunction<T>, который принимает объект типа T и возвращает значение int. Таким образом, ваш метод может выглядеть так (код Java8):

public <T> int method1(List<T> list, ToIntFunction<T> transformation){  
  return list.stream().collect(Collectors.summingInt(transformation));      
}

Затем вы вызываете этот метод следующим образом:

int sumSalaries = method1(consumers, Consumer::getSalary);
int sumDonations = method1(donors, Donor::getAmount);

Также возможен код до Java8, но он будет немного больше (вам потребуется предоставить ToIntFunction, реализации этого интерфейса и тело метода немного большего размера).

В качестве альтернативы вы можете использовать интерфейс, реализованный обоими классами, но для этого потребуется использовать общее имя метода (например, getAmount() или getIntValue() и т. д.)

Другие вопросы по теме