一、实体类
import java.io.Serializable;
import lombok.Data;
@Data
public class ReceiptApply implements Serializable {
private Integer billCode; // 订单号
private String receiptName; // 收款人姓名
private String bankName; // 收款银行
private String receiptAccountNumber; // 收款账号
private Integer money; // 收款金额
private Byte isDeleted;
}
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //get,set
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class ReceiptBankInfo implements Serializable {
private String receiptName; // 收款人姓名
private String bankName; // 收款银行
private String receiptAccountNumber; // 收款账号
}
二、示例一
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
public class LambdaGroupByTest {
@Test
public void groupByTest() {
// 简单条件分组
Map<String, List<ReceiptApply>> map = exportUrlBeans.stream()
.collect(groupingBy(ReceiptApply::getReceiptAccountNum));
// 按 收款人姓名、收款银行、收款账号 分组
HashMap<ReceiptBankInfo, List<ReceiptApply>> map = getReceiptApplys().stream()
.collect(groupingBy(d -> new ReceiptBankInfo(d.getReceiptName(), d.getBankName(), d.getReceiptAccountNumber()),
HashMap::new, toList()));
System.out.println(JSON.toJSONString(map));
}
// 注意:返回 Collection,不要返回List
private Collection<ReceiptApply> getReceiptApplys() {
Collection<ReceiptApply> receiptApplys = new ArrayList<>();
receiptApplys.add(getReceiptApplys(10001, "张三", "中国建设银行", "receiptAccountNumber0001", 100, (byte) 0));
receiptApplys.add(getReceiptApplys(10002, "张三", "中国建设银行", "receiptAccountNumber0001", 200, (byte) 0));
receiptApplys.add(getReceiptApplys(10003, "张三", "中国建设银行", "receiptAccountNumber0001", 300, (byte) 0));
receiptApplys.add(getReceiptApplys(10004, "李四", "工商银行", "receiptAccountNumber0002", 100, (byte) 0));
receiptApplys.add(getReceiptApplys(10005, "李四", "工商银行", "receiptAccountNumber0002", 200, (byte) 0));
return receiptApplys;
}
private ReceiptApply getReceiptApplys(Integer billCode, String receiptName, String bankName, String receiptAccountNumber, Integer money, Byte isDeleted) {
ReceiptApply receiptApply = new ReceiptApply();
receiptApply.setBillCode(billCode);
receiptApply.setReceiptName(receiptName);
receiptApply.setBankName(bankName);
receiptApply.setReceiptAccountNumber(receiptAccountNumber);
receiptApply.setMoney(money);
receiptApply.setIsDeleted(isDeleted);
return receiptApply;
}
}
三、示例二
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
public class LambdaGroupByTest {
@Test
public void groupByTest1() {
// 按 收款人姓名、收款银行、收款账号 分组
HashMap<String, List<ReceiptApply>> map = getReceiptApplys().stream()
.collect(groupingBy(d -> JSON.toJSONString(new ReceiptBankInfo(d.getReceiptName(), d.getBankName(), d.getReceiptAccountNumber())),
HashMap::new, toList()));
// map的key为什么转成String,因为 new一个对象,即使所有属性都相同,但是地址的引用不同,即map的key不同
Map<ReceiptBankInfo, List<ReceiptApply>> resultMap = new HashMap<>();
for (Map.Entry<String, List<ReceiptApply>> entry : map.entrySet()) {
ReceiptBankInfo bankInfo = JSON.parseObject(entry.getKey(), ReceiptBankInfo.class);
resultMap.put(bankInfo, entry.getValue());
}
System.out.println(JSON.toJSONString(map));
System.out.println(JSON.toJSONString(resultMap));
}
private List<ReceiptApply> getReceiptApplys() {
List<ReceiptApply> receiptApplys = new ArrayList<>();
receiptApplys.add(getReceiptApplys(10001, "张三", "中国建设银行", "receiptAccountNumber0001", 100, (byte) 0));
receiptApplys.add(getReceiptApplys(10002, "张三", "中国建设银行", "receiptAccountNumber0001", 200, (byte) 0));
receiptApplys.add(getReceiptApplys(10003, "张三", "中国建设银行", "receiptAccountNumber0001", 300, (byte) 0));
receiptApplys.add(getReceiptApplys(10004, "李四", "工商银行", "receiptAccountNumber0002", 100, (byte) 0));
receiptApplys.add(getReceiptApplys(10005, "李四", "工商银行", "receiptAccountNumber0002", 200, (byte) 0));
return receiptApplys;
}
private ReceiptApply getReceiptApplys(Integer billCode, String receiptName, String bankName, String receiptAccountNumber, Integer money, Byte isDeleted) {
ReceiptApply receiptApply = new ReceiptApply();
receiptApply.setBillCode(billCode);
receiptApply.setReceiptName(receiptName);
receiptApply.setBankName(bankName);
receiptApply.setReceiptAccountNumber(receiptAccountNumber);
receiptApply.setMoney(money);
receiptApply.setIsDeleted(isDeleted);
return receiptApply;
}
}