List最为java编程语音使用最频繁的数据结构之一,经常涉及到对List数据的各种处理,以前我们只能通过遍历的方式,自己去逐条处理,java8提供了Stream能够满足大部分日常对List的操作,如分组,求和,过滤等等,并且效率比自己逐条遍历要快很多,代码也更加简洁。
首先创建一个Student测试的实体类如下
@Data
@ApiModel("学生实体类")
public class StudentEntity {
@ApiModelProperty("主键")
private Long id;
@ApiModelProperty("学号")
private String code;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("体重")
private BigDecimal weight;
@ApiModelProperty("性别")
private String gender;
}
性别的值集我们使用一个枚举来处理
@Getter
@AllArgsConstructor
public enum Gender {
/**
* 男
*/
MALE("male", "男"),
/**
* 女
*/
FEMALE("female", "女");
private String key;
private String value;
}
下面就是对list的常用操作集合
@Log4j2
public class StreamHandler {
public static void main(String[] args) {
List<StudentEntity> list = new ArrayList<>();
list.add(new StudentEntity(){
{
setId(1L);
setCode("10012");
setName("tom");
setAge(13);
setWeight(new BigDecimal("31.2"));
setGender(Gender.MALE.getKey());
}});
list.add(new StudentEntity(){
{
setId(2L);
setCode("10013");
setName("jack");
setAge(13);
setWeight(new BigDecimal("28.9"));
setGender(Gender.MALE.getKey());
}});
list.add(new StudentEntity(){
{
setId(3L);
setCode("10010");
setName("rose");
setAge(12);
setWeight(new BigDecimal("27.6"));
setGender(Gender.FEMALE.getKey());
}});
log.info("original:{}",list);
// 过滤掉体重大于30的学生
List<StudentEntity> weightOverThirty = list.stream().filter(v -> v.getWeight().compareTo(new BigDecimal("30")) <= 0).collect(Collectors.toList());
log.info("weightOverThirty:{}",weightOverThirty);
// 查询年龄最小的学生
StudentEntity minAgeStudent = list.stream().min(Comparator.comparing(StudentEntity::getAge)).get();
log.info("minAgeStudent:{}",minAgeStudent);
// 查询最大的年龄
Integer maxAge = list.stream().map(StudentEntity::getAge).max(Integer::compareTo).get();
log.info("maxAge:{}",maxAge);
// 按照学号排序
List<StudentEntity> sortedByCode = list.stream().sorted(Comparator.comparing(v->Long.parseLong(v.getCode()))).collect(Collectors.toList());
log.info("sortedByCode:{}",sortedByCode);
// 按照性别分组
Map<String, List<StudentEntity>> groupedByGender = list.stream().collect(Collectors.groupingBy(StudentEntity::getGender));
log.info("groupedByGender:{}",groupedByGender);
// 求所有学生的体重之和
BigDecimal weightSum = list.stream().map(StudentEntity::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
log.info("weightSum:{}",weightSum);
}
}
测试打印日志如下
20:19:04.178 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - original:[StudentEntity(id=1, code=10012, name=tom, age=13, weight=31.2, gender=male), StudentEntity(id=2, code=10013, name=jack, age=13, weight=28.9, gender=male), StudentEntity(id=3, code=10010, name=rose, age=12, weight=27.6, gender=female)]
20:19:04.195 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - weightOverThirty:[StudentEntity(id=2, code=10013, name=jack, age=13, weight=28.9, gender=male), StudentEntity(id=3, code=10010, name=rose, age=12, weight=27.6, gender=female)]
20:19:04.199 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - minAgeStudent:StudentEntity(id=3, code=10010, name=rose, age=12, weight=27.6, gender=female)
20:19:04.201 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - maxAge:13
20:19:04.203 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - sortedByCode:[StudentEntity(id=3, code=10010, name=rose, age=12, weight=27.6, gender=female), StudentEntity(id=1, code=10012, name=tom, age=13, weight=31.2, gender=male), StudentEntity(id=2, code=10013, name=jack, age=13, weight=28.9, gender=male)]
20:19:04.205 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - groupedByGender:{
female=[StudentEntity(id=3, code=10010, name=rose, age=12, weight=27.6, gender=female)], male=[StudentEntity(id=1, code=10012, name=tom, age=13, weight=31.2, gender=male), StudentEntity(id=2, code=10013, name=jack, age=13, weight=28.9, gender=male)]}
20:19:04.207 [main] INFO com.wuwl.alibabaexcellearning.helper.StreamHandler - weightSum:87.7
eg:
@Data
@Getter
@AllArgsConstructor
@Log4j2
为lombok的注解,相关功能可自行百度
@ApiModel
@ApiModelProperty
为swagger的常用注解,相信大家都比较熟悉的哈