Java8:函数式编程与Lambda表达式

来源:互联网 发布:联影 算法怎么样 编辑:程序博客网 时间:2024/05/17 23:37

一、代码

/* 3、使用Stream API和Lambda表达式来进行筛选匹配,并依据推送标志进行推送 */      Map<Date, Map<Boolean, List<Schedule>>> scheduleTodayMap = pushSchedules              .stream()              .collect(                      groupingBy(                              Schedule::getEffectdate,                              groupingBy((Schedule s) -> StringUtil                                      .formatDate(new Date(), "yyyy-MM-dd")                                      .equals(StringUtil.formatDate(                                              s.getEffectdate(), "yyyy-MM-dd")))));      List<Schedule> scheduleTodayList = null;      for (Map<Boolean, List<Schedule>> v : scheduleTodayMap.values())          scheduleTodayList = v.get(true);      List<Room> rooms = (List<Room>) roomRepository.findAll();      List<String> roomCodes = scheduleTodayList.stream()              .map(Schedule::getRoom).map(Room::getCode)              .flatMap(s -> rooms.stream().map(Room::getCode).filter(s1 -> {                  return s.equals(s1) == true;              })).collect(toList());      boolean isRoomCodeInDataBase = false;      if (scheduleTodayList != null)          isRoomCodeInDataBase = roomCodes.size() > 0;      String roomCode;      String userCode;      Integer flag;      int i = 0;      for (String s : scheduleToday) {          roomCode = s.substring(s.indexOf("-") + 1, s.indexOf("*"));          userCode = s.substring(s.indexOf(".") + 1, s.indexOf("-"));          flag = Integer.valueOf(s.substring(s.indexOf("*") + 1));          room = roomRepository.findByCode(roomCode);          doctor = doctorRepository.findByCode(userCode);          if (isRoomCodeInDataBase) {              roomService.updateRoom(room.getId(), room.getName(),                      doctor.getCode(), doctor.getName(), doctor.getProfit(),                      doctor.getPhotoPath());              pushSchedule(room, doctor, flag, flush);              i++;              if (i == scheduleToday.size())                  f = 0;/* 最后,将成功标志置为0 */          }      }      return f.toString(); 

二、业务场景

        详见:流程设计与代码注释:冷思考(二)

三、重构缘由

        项目早与2016年前交付使用,2017年4月初,由于硬件故障频发,需要从软件方面进行优化,在修改代码时,发现原代码封装与抽象都做的不太好,一些设计模式也未很好的应用,最近也正好在看一些Java的书籍,遂使用Java8的函数式编程新特性尝试了一二,代码量减少明显,抽象与封装、命名和注释也更加规范。

0 0