根据属性值返回筛选的java对象列表

根据属性值返回筛选的java对象列表,java,Java,假设我有一个对象数组(付款): 我想获得一个数组,其中包含基于付款类型的金额总和如下的对象: filtredList = [Payment(type='check', amount=50),Payment(type='cash', amount=40)] 但是我不想硬编码类型因为我可以有多种支付类型,您能帮我找到一种通用的方法来实现这一点吗,提前谢谢。如果您使用java 8或更高版本,您可以这样做: listOfPayment.stream() .collect(收集器.groupingBy

假设我有一个对象数组(付款):

我想获得一个数组,其中包含基于付款类型的金额总和如下的对象:

filtredList = [Payment(type='check', amount=50),Payment(type='cash', amount=40)]

但是我不想硬编码类型因为我可以有多种支付类型,您能帮我找到一种通用的方法来实现这一点吗,提前谢谢。

如果您使用java 8或更高版本,您可以这样做:


listOfPayment.stream()
.collect(收集器.groupingBy(
付款::getType,
催收员。汇总长(付款::getAmount)))
.entrySet()
.stream()
.map(条目->新付款(条目.getKey(),条目.getValue().getSum())
.collect(Collectors.toList());

如果您使用的是java 8或更高版本,则可以执行以下操作:


listOfPayment.stream()
.collect(收集器.groupingBy(
付款::getType,
催收员。汇总长(付款::getAmount)))
.entrySet()
.stream()
.map(条目->新付款(条目.getKey(),条目.getValue().getSum())
.collect(Collectors.toList());

由于Marco已经提供了使用streams的解决方案,下面是一种很好的迭代方法:

Map typeToSum=newhashmap();
用于(付款:付款){
字符串类型=payment.getType();
int amount=payment.getAmount();
int newSum=typeToSum.getOrDefault(type,0)+金额;
类型tosum.put(类型,newSum);
}
列表结果=新的ArrayList(typeToSum.size());
for(条目:typeToSum.entrySet()){
付款付款=新付款(entry.getKey(),entry.getValue());
结果。添加(付款);
}
系统输出打印项次(结果);

由于Marco已经提供了使用streams的解决方案,下面是一种很好的迭代方法:

Map typeToSum=newhashmap();
用于(付款:付款){
字符串类型=payment.getType();
int amount=payment.getAmount();
int newSum=typeToSum.getOrDefault(type,0)+金额;
类型tosum.put(类型,newSum);
}
列表结果=新的ArrayList(typeToSum.size());
for(条目:typeToSum.entrySet()){
付款付款=新付款(entry.getKey(),entry.getValue());
结果。添加(付款);
}
系统输出打印项次(结果);
一种方法

static Map<String, Integer> paymentMap = new HashMap<String, Integer>();

private static Payment[] getFilterdPayments() {
    Payment[] listPayments = new Payment[] { new Payment("check", 25), new Payment("cash", 20),
            new Payment("check", 25), new Payment("cash", 20) };
    for (Payment payment : listPayments) {
        addValueToMap(payment.getType(), payment.getValue());
    }

    List<Payment> filteredlist=new ArrayList<Payment>();
    for (String type : paymentMap.keySet()) {
        filteredlist.add(new Payment(type, paymentMap.get(type)));
    }
    
    return (Payment[]) filteredlist.toArray(new Payment[0]);
}

private static void addValueToMap(String key, int value) {
    if(paymentMap.containsKey(key)) {
        paymentMap.put(key, value+paymentMap.get(key));
    }
    else {
        paymentMap.put(key, value);
    }
}`
staticmap paymentMap=newhashmap();
私人静态支付[]getFilterdPayments(){
付款[]列表付款=新付款[]{新付款(“支票”,25),新付款(“现金”,20),
新付款(“支票”,25),新付款(“现金”,20)};
用于(付款:列表付款){
addValueToMap(payment.getType(),payment.getValue());
}
List filteredlist=新建ArrayList();
for(字符串类型:paymentMap.keySet()){
添加(新付款(类型,paymentMap.get(类型));
}
返回(付款[])筛选器列表到阵列(新付款[0]);
}
私有静态void addValueToMap(字符串键,int值){
if(paymentMap.containsKey(关键)){
paymentMap.put(key,value+paymentMap.get(key));
}
否则{
paymentMap.put(键、值);
}
}`
一种方法

static Map<String, Integer> paymentMap = new HashMap<String, Integer>();

private static Payment[] getFilterdPayments() {
    Payment[] listPayments = new Payment[] { new Payment("check", 25), new Payment("cash", 20),
            new Payment("check", 25), new Payment("cash", 20) };
    for (Payment payment : listPayments) {
        addValueToMap(payment.getType(), payment.getValue());
    }

    List<Payment> filteredlist=new ArrayList<Payment>();
    for (String type : paymentMap.keySet()) {
        filteredlist.add(new Payment(type, paymentMap.get(type)));
    }
    
    return (Payment[]) filteredlist.toArray(new Payment[0]);
}

private static void addValueToMap(String key, int value) {
    if(paymentMap.containsKey(key)) {
        paymentMap.put(key, value+paymentMap.get(key));
    }
    else {
        paymentMap.put(key, value);
    }
}`
staticmap paymentMap=newhashmap();
私人静态支付[]getFilterdPayments(){
付款[]列表付款=新付款[]{新付款(“支票”,25),新付款(“现金”,20),
新付款(“支票”,25),新付款(“现金”,20)};
用于(付款:列表付款){
addValueToMap(payment.getType(),payment.getValue());
}
List filteredlist=新建ArrayList();
for(字符串类型:paymentMap.keySet()){
添加(新付款(类型,paymentMap.get(类型));
}
返回(付款[])筛选器列表到阵列(新付款[0]);
}
私有静态void addValueToMap(字符串键,int值){
if(paymentMap.containsKey(关键)){
paymentMap.put(key,value+paymentMap.get(key));
}
否则{
paymentMap.put(键、值);
}
}`

非常感谢@Marco你救了我一天^^非常感谢@Marco你救了我一天^感谢Utku,它非常有用,实际上我有两个有用的解决方案^感谢Utku,它非常有用,实际上我有两个有用的解决方案^谢谢Shubham的回答,但我想要一个没有硬编码值的通用解决方案,thaks很多。嗨,@noussair-我可以知道我在哪里硬编码的值吗。?如果您是指以下行:
Payment[]listPayments=new Payment[]{new Payment(“check”,25),new Payment(“cash”,20),new Payment(“check”,25),new Payment(“cash”,20)}我刚刚声明了您自己提供的测试数据。基本上,这是您的输入,而不是代码的一部分。我们可以删除它,我们仍然有一个有效的解决方案。谢谢Shubham的回答,但我想要一个没有硬编码值的通用解决方案,thaks很多。嗨,@noussair-我可以知道我在哪里硬编码了值吗。?如果您是指以下行:
Payment[]listPayments=new Payment[]{new Payment(“check”,25),new Payment(“cash”,20),new Payment(“check”,25),new Payment(“cash”,20)}我刚刚声明了您自己提供的测试数据。基本上,这是您的输入,而不是代码的一部分。我们可以消除这一点,我们仍然有一个有效的解决方案。