Stream常見用法:集合建立時間最小的元素、集合中最大的建立時間、集合分組並統計數量、集合按指定屬性分組
阿新 • • 發佈:2022-04-20
記錄Stream對集合常見的幾個用法:
測試物件 Order
@Data
@AllArgsConstructor
@ToString
public class Order {
public String userId;
public String orderId;
private Long createTime;
public Long amount;
}
用法
// 測試資料 Order order1 = new Order("u-001", "o-800", 1650435798635L, 101L); Order order2 = new Order("u-001", "o-801", 1650435838644L, 102L); Order order3 = new Order("u-002", "o-802", 1650435871646L, 98L); Order order4 = new Order("u-003", "o-803", 1650435898645L, 220L); Order order5 = new Order("u-003", "o-804", 1650435917645L, 300L); List<Order> orderList = Arrays.asList(order1, order2, order3, order4, order5); // 1. 查詢出訂單集合中建立時間最小的元素 Optional<Order> minCreateTimeOption = orderList.stream().min(Comparator.comparing(Order::getCreateTime)); if (minCreateTimeOption.isPresent()) { Order minCreateTimeOrder = minCreateTimeOption.get(); System.out.println(minCreateTimeOrder); } // 2. 查詢訂單集合中最大的建立時間 OptionalLong maxCreateTime = orderList.stream().mapToLong(Order::getCreateTime).max(); System.out.println("最大的建立時間:" + maxCreateTime); // 3. 統計訂單集合每個使用者的訂單數量 Map<String, Long> groupByUserAndStatNumMap = orderList.parallelStream().collect(Collectors.groupingBy(Order::getUserId, Collectors.counting())); Iterator<Map.Entry<String, Long>> iterator = groupByUserAndStatNumMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Long> entry = iterator.next(); System.out.println("使用者id:"+entry.getKey() + ", 訂單數:=" + entry.getValue()); } // 4.按使用者分組 Map<String, List<Order>> groupByUserMap = orderList.parallelStream() .collect(Collectors.groupingBy(Order::getUserId));