Java8新特性Stream
什么是Stream流?
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素队列 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等
个人使用stream主要是在对集合操作时,其他地方使用得较少,接下来就介绍一下集合的stream流操作。
stream流操作
操作1:将类的集合转化成类中某个属性的集合,并对这个属性进行处理
LeaveRecord.java
public class LeaveRecordTime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "leave_record_id") private Integer leaveRecordId; @Column(name = "time") private Date time; @Column(name = "student_id") private Integer studentId; }
//数据库中查询获取请假的时间记录
List<LeaveRecordTime> leaveRecordTimes = leaveRecordTimeRepository.listByStuIdAndTime(studentId, beginTime, endTime); //获取请假的日期并将日期的时分秒毫秒都置零 List<Date> leaveRecordDates = leaveRecordTimes.stream().map(e -> { return DateUtil.getFirstTimeOfDay(e.getTime()); }).collect(Collectors.toList());

操作2:List转Map并对键值进行处理
public class SchoolLeaveTime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "school_id") private Integer schoolId; @Column(name = "time") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date time; @Column(name = "title") String title;//标题 @Column(name = "remark") String remark;//描述 }
//获取学校停餐的记录 List<SchoolLeaveTime> schoolLeaveTimes = schoolLeaveTimeRepository. listBySchoolIdAndTime(student.getSchool().getId(), beginTime, endTime); //获取学校停餐的日期与信息的键值对集合,并将日期的时分秒毫秒都置零 Map<Date, SchoolLeaveTime> schoolLeaveDateMap = schoolLeaveTimes.stream().collect(Collectors.toMap(e -> { return DateUtil.getFirstTimeOfDay(e.getTime()); }, e -> e, (e1, e2) -> e2));

处理3,:多字段排序
List<LeaveRecord> all = leaveRecordRepository.findAll(); //先按创建时间排序,以前面的结果为基础,再按年级排序,null统一处理,排到最后面 List<LeaveRecord> collect = all.stream().sorted(Comparator .comparing(LeaveRecord::getCreateTime, Comparator.nullsLast(Date::compareTo)) .thenComparing(LeaveRecord::getGrade, Comparator.nullsLast(String::compareTo))) .collect(Collectors.toList());
处理4:分组统计
//分组统计,按学校分组,并统计学生的用餐次数 Map<Integer, IntSummaryStatistics> collect1 = all.stream().collect(Collectors.groupingBy(LeaveRecord::getSchoolId, Collectors.summarizingInt(LeaveRecord::getCurrentCount)));

浙公网安备 33010602011771号