java 8 lambda表达式对list进行分组
java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。
分组函数groupingBy()
分组函数示例:
Map<String, List<Workers>> groupBySex = WorkersList.stream().filter(v->v.getName()!=null).collect(Collectors.groupingBy(Workers::getName));
从WorkersList中筛选出name不为空的数据,再对这些数据按照name进行分组,分组结果是一个map。
1.创建实体类
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可以分组指定字段
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空值安全问题,需要做过滤或封装处理,这里用到的过滤方法是:
filter(v->v.getName()!=null)