我相信对于大多数程序员来说,日常工作过程当中难免少不了针对集合的操作,若要对集合进行分组、筛选、针对某字段求和求和,则需要写大量的代码去实现某一功能,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());