java 8 有关List的分组、排序、求和等操作详解

我相信对于大多数程序员来说,日常工作过程当中难免少不了针对集合的操作,若要对集合进行分组、筛选、针对某字段求和求和,则需要写大量的代码去实现某一功能,java 8 推出的流则是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。

因此,流的集合操作对我们来说是透明的,我们只需向流下达命令,它就会自动把我们想要的结果给我们。由于操作过程完全由Java处理,因此它可以根据当前硬件环境选择最优的方法处理,我们也无需编写复杂又容易出错的多线程代码了

首先贴出本次使用的代码以及数据实体类

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;
    @TableId(value = "ID", type = IdType.AUTO)
    private Integer id;
    /**
     * 姓名
     */
    @TableField("PERSON_NAME")
    private String personName;
    /**
     * 年龄
     */
    @TableField("PERSON_AGE")
    private Integer personAge;
    /**
     * 性别
     */
    @TableField("PERSON_GENDER")
    private String personGender;
    /**
     * 学历
     */
    @TableField("PERSON_EDUCATION")
    private String personEducation;
    /**
     * 工作年限
     */
    @TableField("PERSON_WORK_YEARS")
    private Integer personWorkYears;
    /**
     * 手机号
     */
    @TableField("PERSON_PHONE")
    private String personPhone;
    /**
     * 邮箱账号
     */
    @TableField("PERSON_EMAIL")
    private String personEmail;
    /**
     * 大头贴照片
     */
    @TableField("PERSON_IMAGE")
    private String personImage;
    /**
     * 简历名
     * 是否为数据库字段
     */
    @TableField(exist = false)
    private  String resumeTitle;

常用操作:

 分组操作

// 手动new 五个实体类放进集合内 然后根据Id 进行分组(可自行选择字段) 
List<Person> lost = new ArrayList<>();
        lost.add(infoPerson); 
        lost.add(infoPerson1);
        lost.add(infoPerson2);
        lost.add(infoPerson3);
        lost.add(infoPerson4);
        Map<Integer, List<Person>> collect = lost.stream().collect(Collectors.groupingBy(Person::getId));

② 求和、最大值、最小值 操作

// 从数据库去除数据数据条数为五条 
// 由于在求和的过程当中避免不了存在 null 或者 空字符串的数据
// 因此可使用filter()进行条件筛选 具体筛选条件 根据业务而定
List<Person> personList = personService.list();
Integer collect = personList.stream()
        .filter(a -> a.getPersonWorkYears() != null && !a.getPersonWorkYears().equals(""))
        .collect(Collectors.summingInt(Person::getPersonWorkYears));
又或者
personList.stream().mapToInt(t -> t.getPersonWorkYears()).sum()


// 求最大值  最小值将 max 函数 替换min即可
// compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。
// 该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较
Integer integer = personList.stream().map(Person::getId).max(Integer::compareTo).get();


// 获取最大值或最小值的这个对象 
 Comparator<Person> comparator = Comparator.comparing(Person::getPersonWorkYears);
        Person maxObject = personList.stream().filter(a -> a.getPersonWorkYears() !=     
 null).max(comparator).get();

 值得注意的一点就是 在整个过程单当中 如果项目数据库设计的某字段允许为空或者null 的话  在进行最大值最小值火或求和等操作时候一定要注意加上 filter() 进行条件筛选 ,保证 null 不参与计算 , 否则会报错

③ 排序 

// 针对personWorkYears 排序 
// 升序排序
List<Person> collect = 
             personList.stream().filter(a -> a.getPersonWorkYears()!=null)
              .sorted(Comparator.comparingInt(Person::getPersonWorkYears))
               .collect(Collectors.toList());
// 降序排序
List<Person> collect2 = 
             personList.stream().filter(a -> a.getPersonWorkYears()!=null)
              .sorted((a,b) -> b.getPersonWorkYears() - a.getPersonWorkYears())
               .collect(Collectors.toList());
// 多字段排序 
List<Person> collect = 
             personList.stream().filter(a -> a.getPersonWorkYears()!=null)
              .sorted(Comparator.comparingInt(Person::getPersonWorkYears).thenComparing(Person::getId))
               .collect(Collectors.toList());

④ 去重

// 去重
List<Person> collect1 = personList.stream().distinct().collect(Collectors.toList());

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值