根據起始時間和結束時間,先把begin放入集合中用while循環當begin不等于end的時候,讓begin加一天,這樣就把這個區間內的時間放到List集合。
查詢每天的訂單總數也就是查詢的時間段是大于當天的開始時間(0點0分0秒)小于當天的結束時間的(23點59分59秒)的。
//查詢每天的訂單總數 select count(id) from orders where order_time > ? and order_time < ?
查詢有效訂單數,不僅是當天的時間段還要狀態是已完成的訂單,status=5代表已完成。
//查詢每天的有效訂單數 select count(id) from orders where order_time > ? and order_time < ? and status = 5
/*** 統計指定時間區間內的訂單數據* @param begin* @param end* @return*/public OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end) {//存放從begin到end之間的每天對應的日期List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!begin.equals(end)){begin = begin.plusDays(1);dateList.add(begin);}//存放每天的訂單總數List<Integer> orderCountList = new ArrayList<>();//存放每天的有效訂單數List<Integer> validOrderCountList = new ArrayList<>();//遍歷dateList集合,查詢每天的有效訂單數和訂單總數for (LocalDate date : dateList) {//查詢每天的訂單總數 select count(id) from orders where order_time > ? and order_time < ?LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);Integer orderCount = getOrderCount(beginTime, endTime,null);//查詢每天的有效訂單數 select count(id) from orders where order_time > ? and order_time < ? and status = 5Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED);orderCountList.add(orderCount);validOrderCountList.add(validOrderCount);}//計算時間區間內的訂單總數量Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get();//計算時間區間內的有效訂單數量Integer validOrderCount = validOrderCountList.stream().reduce(Integer::sum).get();Double orderCompletionRate = 0.0;if (totalOrderCount != 0){//計算訂單完成率orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;}return OrderReportVO.builder().dateList(StringUtils.join(dateList,",")).orderCountList(StringUtils.join(orderCountList,",")).validOrderCountList(StringUtils.join(validOrderCountList,",")).totalOrderCount(totalOrderCount).validOrderCount(validOrderCount).orderCompletionRate(orderCompletionRate).build();}private Integer getOrderCount(LocalDateTime begin,LocalDateTime end,Integer status){Map map = new HashMap();map.put("begin",begin);map.put("end",end);map.put("status",status);return orderMapper.countByMap(map);}
?·功能測試
Stream流的使用步驟
1.獲取Stream流?
·獲取集合的Stream流
Collection提供的如下方法???????? 說明
default Stream<E> stream()????? 獲取當前集合對象的Stream流
·獲取數組的Stream流
Arrays類提供的如下方法??????????? 說明
public static <T> Stream<T> stream(T[] array)? 獲取當前數組的Stream流
public static <T> Stream<T> of(T...values)???????? 獲取當前接收數據的Stream流
中間方法指的是調用完成后會返回新的Stream流,可以繼續使用(支持鏈式編程)。
終結方法指的是調用完成后,不會返回新的Stream了,沒法繼續使用流了。
2.Stream提供的常用中間方法???? 說明
Stream <T> filter(Predicate<? super T>predicate)??? 用于對流中的數據進行過濾
Stream <T> sorted()????????????????????????????????????????????????? 對元素進行升序排序
Stream <T> sorted(Comparator<? super T> comparator) 按照指定規則排序
Stream <T> limit(long maxSize)???????????????????????????????? 獲取前幾個元素
Stream <T> skip(long n)???????????????????????????????????????????? 跳過前幾個元素
Stream <T> distinct()????????????????????????????????????????????????? 去除流中重復的元素
<R>Stream<R> map(Function<? super T,?extends R> mapper)
對元素進行加工,并返回對應的新流
static <T> Stream<T> concat(Stream a,Stream b) ? ? 合并a和b兩個流為一個流
3.Stream流常見的終結方法
Stream提供的常用終結方法?????????????? 說明
void forEach(Consumer action)????????? 對此流運算后的元素執行遍歷
long count()???????????????????????????????????????? 統計此流運算后的元素個數
Optional<T> max(Comparator<? super T> comparator)
獲取此流運算后最大值元素
Optional<T> min(Comparator<? super T> comparator)
獲取此流運算后最小值元素
收集Stream流:就是把Stream流操作后的結果轉回到集合或者數組中去返回。
Stream流:方便操作集合/數組手段;集合/數組:才是開發中的目的。
Stream提供的常用終結方法??????????????? 說明
R collect(Collector collector)??????????????? 把流處理后的結果收集到一個指定的集合中去
Object toArray()?????????????????????????????????? 把流處理后的結果收集到一個數組中去
流只能收集一次
Collectors工具類提供了具體的收集方式???????????? 說明
public static <T> Collector toList()?????????????????????? 把元素收集到List集合中去
public static <T> Collector toSet()?????????????????????? 把元素收集到Set集合中去
public static Collector toMap(Function KeyMapper,Function valueMapper)
把元素收集到Map集合中
我的筆記中沒有這個Stream.reduce()方法,所以我去查了一下。
Stream.reduce()是Java 8引入的一個強大的工具,用于對流中的元素進行歸納操作。
reduce方法可以將流中的多個元素組合成一個單一的結果,通常用于求和、求乘積、查找最大值或最小值等操作。
reduce方法的基本用法
reduce(BinaryOperator<T> accumulator)
這種方法沒有初始值,流的第一個元素將作為初始值。返回的是Optional<T>,以防流為空。例如:
Optional<Integer> sum = list.stream().reduce((a,b)->a + b);
2.有初始值?:T reduce(T identity, BinaryOperator<T> accumulator)。這種方法有一個初始值identity,可以保證即使流為空也會有一個默認結果。返回的是T。例如:
int sum = list.stream().reduce(0, (a, b) -> a + b);
?3.并行流操作?:reduce(U identity, BiFunction<U, T, U> accumulator, BinaryOperator<U> combiner)。這種方法適用于并行流操作,可以通過兩個函數實現累加器和合并器的分離。例如:
int sum = list.parallelStream().reduce(0, (partialResult, element) -> partialResult + element, Integer::sum);
reduce方法的應用場景
?1.求和?:將流中的所有元素相加。例如,計算一個整數列表的總和。
?2.求乘積?:將流中的所有元素相乘。例如,計算一個整數列表的乘積。
?3.查找最大值或最小值?:通過比較操作,找到流中的最大值或最小值。
?4.連接字符串?:將流中的字符串元素連接成一個新的字符串。例如,將多個單詞連接成一個句子。
?5.自定義聚合操作?:通過自定義的累加器函數,實現更復雜的聚合操作。例如,計算兩個數的平均值。