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)));
 
posted @ 2020-09-14 15:08  it00zyq  阅读(232)  评论(0)    收藏  举报