java8 lambda表达式Stream对List常用操作总结

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的常用注解,相信大家都比较熟悉的哈

猜你喜欢

转载自blog.csdn.net/qq_41885819/article/details/120853638