java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。
分组函数groupingBy()
分组函数示例:
java
Map<String, List<Workers>> groupBySex =
WorkersList.stream()
.filter(v->v.getName()!=null)
.collect(Collectors.groupingBy(Workers::getName));
从WorkersList中筛选出name不为空的数据,再对这些数据按照name进行分组,分组结果是一个map。
1.创建实体类
java
import java.math.BigDecimal;
import java.util.Date;
public class Workers {
private Long id;
//姓名
private String name;
//年龄
private int age;
//工号
private String jobNumber;
//性别
private String sex;
//入职日期
private Date entryDate;
//家庭成员数量
private BigDecimal familyMemberQuantity;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJobNumber() {
return jobNumber;
}
public void setJobNumber(String jobNumber) {
this.jobNumber = jobNumber;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getEntryDate() {
return entryDate;
}
public void setEntryDate(Date entryDate) {
this.entryDate = entryDate;
}
public BigDecimal getFamilyMemberQuantity() {
return familyMemberQuantity;
}
public void setFamilyMemberQuantity(BigDecimal familyMemberQuantity) {
this.familyMemberQuantity = familyMemberQuantity;
}
}
2.分组
通过groupingBy可以分组指定字段
java
public class Application {
public static void main(String[] args) {
List<Workers> WorkersList = new ArrayList<>();
Workers workers = new Workers();
workers.setAge(23);
workers.setName("jimmy");
workers.setJobNumber("mk");
Workers worker = new Workers();
worker.setAge(19);
worker.setName("gigi");
worker.setJobNumber("mimi");
WorkersList.add(workers);
//分组
Map<String, List<Workers>> groupBySex = WorkersList.stream().filter(v->v.getName()!=null).collect(Collectors.groupingBy(Workers::getName));
//遍历分组
for (Map.Entry<String, List<Workers>> entryWorkers : groupBySex.entrySet()) {
String key = entryWorkers.getKey();
List<Workers> entryWorkersList = entryWorkers.getValue();
System.out.println(entryWorkersList);
}
}
}
注意:
(1)上面的分组存在key空值安全问题,需要做过滤或封装处理,这里用到的过滤方法是:
java
filter(v->v.getName()!=null)