Java 8分组与返回多个字段 [英] Java 8 groupingby with returning multiple field

查看:155
本文介绍了Java 8分组与返回多个字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Java 8组中,如何在一个返回多个字段的字段上进行分组。在下面的代码中,我传递名称和要求的字段,在这种情况下是总计。但是,我想为客户列表中的每个名称返回总计和余额字段的总和(可以是键和值为数组的映射)。
可以通过使用带有返回值的单个groupingBy来完成吗?

In Java 8 group by how to groupby on a single field which returns more than one field. In the below code by I am passing name and the field to be summed which is 'total' in this scenario. however I would like to return sum of 'total' and 'balance' field for every 'name' in the Customer list (can be a map with key and value as array). Can it be done by using a single groupingBy with the return values?

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class Sample {

    public static void main(String str[]){
        Customer custa = new Customer("A",1000,1500);
        Customer custa1 = new Customer("A",2000,2500);
        Customer custb = new Customer("B",3000,3500);
        Customer custc = new Customer("C",4000,4500);
        Customer custa2 = new Customer("A",1500,2500);

        List<Customer> listCust = new ArrayList<>();
        listCust.add(custa);
        listCust.add(custa1);
        listCust.add(custb);
        listCust.add(custc);
        listCust.add(custa2);

        Map<String, Double> retObj = 
            listCust.stream().collect(Collectors.groupingBy(Customer::getName,Collectors.summingDouble(Customer::getTotal)));


    System.out.println(retObj);
    }

    private static class Customer {
        private String name;
        private double total;
        private double balance;

        public Customer(String name, double total, double balance) {
            super();
            this.name = name;
            this.total = total;
            this.balance = balance;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getTotal() {
            return total;
        }
        public void setTotal(double total) {
            this.total = total;
        }
        public double getBalance() {
            return balance;
        }
        public void setBalance(double balance) {
            this.balance = balance;
        }
        @Override
        public String toString() {
            return "Customer [name=" + name + ", total=" + total + ", balance=" + balance + "]";
        }

    }
}

预期输出 -

{ 
  A = [4500,6500],
  B = [3000,3500] ,
  C = [4000,4500]
}


推荐答案

您可以编写自己的收集器来计算总和余额

You can write your own collector to sum total and balance

Collector<Customer, List<Double>, List<Double>> collector = Collector.of(
        () -> Arrays.asList(0.0, 0.0),
        (a, t) -> {
            a.set(0, a.get(0) + t.getTotal());
            a.set(1, a.get(1) + t.getBalance());
        },
        (a, b) -> {
            a.set(0, a.get(0) + b.get(0));
            a.set(1, a.get(1) + b.get(1));
            return a;
        }
);

Map<String, List<Double>> retObj = listCust
        .stream()
        .collect(Collectors.groupingBy(Customer::getName, collector));

System.out.println(retObj);

结果

{A=[4500.0, 6500.0], B=[3000.0, 3500.0], C=[4000.0, 4500.0]}

这篇关于Java 8分组与返回多个字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆