发送不同对象的列表并返回其属性的总和

时间:2018-09-06 15:07:44

标签: java

我必须上课

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);
    }




}

我想使此method1()动态并返回动态结果。

因此,如果我发送“消费者”列表,那么它应该向我退回所有薪水的总和;如果我发送“捐赠者”列表,那么它应该向我发送捐赠金额的总和?

这如何实现?

1 个答案:

答案 0 :(得分:7)

首先,您可能不使类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()等)