Stream操作时Collectors工具类中常用方法
文章目錄
- 示例文件準備
 - 實體類User :
 - 測試main方法制作數據 :
 
- 聚合與分組
 - toList、toSet、toCollection
 - toMap、toConcurrentMap
 - groupingBy、groupingByConcurrent
 - partitioningBy
 
- 數據連接
 - joining
 
- 操作鏈
 - collectingAndThen
 
- 先操作后聚合
 - mapping
 
- 先聚合后操作
 - reducing
 
- 數據統計
 - counting
 - averagingDouble、averagingInt、averagingLong
 - summingDouble、summingInt、summingLong
 - maxBy、minBy
 - summarizingDouble、summarizingInt、summarizingLong
 
示例文件準備
實體類User :
@Data public class User {private String userId;private String name;private String address;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")private Date createTime;private int age;private Long uuid;}測試main方法制作數據 :
public static void main(String[] args) throws Exception{SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));User user1 = new User();user1.setUserId("11");user1.setAddress("地址11");user1.setName("姓名11");user1.setCreateTime(sdf.parse("2020-07-09 21:12:45"));user1.setAge(20);User user2 = new User();user2.setUserId("22");user2.setAddress("地址22");user2.setName("姓名22");user2.setCreateTime(sdf.parse("2020-08-09 21:12:45"));user2.setAge(21);User user3 = new User();user3.setUserId("33");user3.setAddress("地址33");user3.setName("姓名33");user3.setCreateTime(sdf.parse("2020-07-10 21:12:45"));user3.setAge(30);User user4 = new User();user4.setUserId("44");user4.setAddress("地址44");user4.setName("姓名44");user4.setAge(20);User user5 = new User();user5.setUserId("55");user5.setAddress("地址55");user5.setName("姓名55");user5.setAge(40);User user6 = new User();user6.setUserId("66");user6.setAddress("地址66");user6.setName("姓名11");user6.setCreateTime(sdf.parse("2016-01-10 21:12:45"));user6.setAge(10);User user7 = new User();user7.setUserId("11");user7.setAddress("地址77777");user7.setName("姓名11");// user7.setCreateTime(sdf.parse("2020-01-10 21:12:45"));user7.setAge(26);User user8 = new User();user8.setUserId("11");user8.setAddress("地址8888");user8.setName("姓名11");// user8.setCreateTime(sdf.parse("2020-05-10 21:12:45"));List<User> list1 = new ArrayList<>();list1.add(user1);list1.add(user2);list1.add(user3);list1.add(user4);list1.add(user6);list1.add(user7);list1.add(user8); }聚合與分組
toList、toSet、toCollection
描述:將聚合之后的元素,重新封裝到隊列中,然后返回
 返回類型:List<T>和Set<T>和Collection<T>
toMap、toConcurrentMap
描述:這兩個方法的作用是將聚合元素,重新組裝為Map結構,也就是 k-v 結構。兩者用法一樣,區別是toMap返回的是Map,toConcurrentMap返回ConcurrentMap,也就是說,toConcurrentMap返回的是線程安全的 Map 結構【toMap結果是 1:1 的 k-v 結構】
返回類型:Map<K,V>
//輸出結果 {66=User(userId=66, name=姓名11, address=地址66, createTime=Sun Jan 10 21:12:45 CST 2016, age=10, uuid=null)XXXXXX數據太多了} //得到根據id分組后數據 Map<String, User> map2 = list1.stream().collect(Collectors.toMap(User::getUserId, Function.identity(), (x, y) -> x));//輸出結果 {66=姓名11, 44=姓名44, 33=姓名33, 22=姓名22, 11=姓名11} //得到根據id分組后的姓名 Map<String, String > map3 = list1.stream().collect(Collectors.toMap(User::getUserId, User::getName, (x, y) -> x));groupingBy、groupingByConcurrent
描述:groupingBy與toMap都是將聚合元素進行分組,區別是,toMap結果是 1:1 的 k-v 結構,groupingBy的結果是 1:n 的 k-v 結構。
返回類型:Map<K,T<T>>
//輸出結果 {0=[User(userId=11, name=姓名11, address=地址8888, createTime=null, age=0, uuid=null)], 20=[User(userId=11, name=姓名11, address=地址11, createTime=Thu Jul 09 21:12:45 CST 2020, age=20, uuid=null), User(userId=44, name=姓名44, address=地址44, createTime=null, age=20, uuid=null)], 21=[User(userId=22, name=姓名22, address=地址22, createTime=Sun Aug 09 21:12:45 CST 2020, age=21, uuid=null)], 26=[User(userId=11, name=姓名11, address=地址77777, createTime=null, age=26, uuid=null)], 10=[User(userId=66, name=姓名11, address=地址66, createTime=Sun Jan 10 21:12:45 CST 2016, age=10, uuid=null)], 30=[User(userId=33, name=姓名33, address=地址33, createTime=Fri Jul 10 21:12:45 CST 2020, age=30, uuid=null)]} //得到根據age分組后數據 Map<Integer, List<User>> map5 = list1.stream().collect(Collectors.groupingBy(User::getAge));//輸出結果 {0=[User(userId=11, name=姓名11, address=地址8888, createTime=null, age=0, uuid=null)], 20=[User(userId=11, name=姓名11, address=地址11, createTime=Thu Jul 09 21:12:45 CST 2020, age=20, uuid=null), User(userId=44, name=姓名44, address=地址44, createTime=null, age=20, uuid=null)], 21=[User(userId=22, name=姓名22, address=地址22, createTime=Sun Aug 09 21:12:45 CST 2020, age=21, uuid=null)], 26=[User(userId=11, name=姓名11, address=地址77777, createTime=null, age=26, uuid=null)], 10=[User(userId=66, name=姓名11, address=地址66, createTime=Sun Jan 10 21:12:45 CST 2016, age=10, uuid=null)], 30=[User(userId=33, name=姓名33, address=地址33, createTime=Fri Jul 10 21:12:45 CST 2020, age=30, uuid=null)]} //得到根據age分組后數據 Map<Integer, Set<User>> map6 = list1.stream().collect(Collectors.groupingBy(User::getAge, Collectors.toSet()));既然groupingBy也是分組,是不是也能夠實現與toMap類似的功能,比如,根據 id 分組
//輸出結果 {66=User(userId=66, name=姓名11, address=地址66, createTime=Sun Jan 10 21:12:45 CST 2016, age=10, uuid=null), 44=User(userId=44, name=姓名44, address=地址44, createTime=null, age=20, uuid=null), 33=User(userId=33, name=姓名33, address=地址33, createTime=Fri Jul 10 21:12:45 CST 2020, age=30, uuid=null), 22=User(userId=22, name=姓名22, address=地址22, createTime=Sun Aug 09 21:12:45 CST 2020, age=21, uuid=null), 11=User(userId=11, name=姓名11, address=地址11, createTime=Thu Jul 09 21:12:45 CST 2020, age=20, uuid=null)} //與上面的 map2 結果是相同的Map<String, Object> map7 = list1.stream().collect(Collectors.groupingBy(User::getUserId, Collectors.collectingAndThen(Collectors.toList(), list -> list.get(0))));想要線程安全的Map,可以使用groupingByConcurrent
partitioningBy
描述:partitioningBy與groupingBy的區別在于,partitioningBy借助Predicate斷言,可以將集合元素分為true和false兩部分
返回類型:Map<Boolean,T<T>>
//輸出結果 {false=[User(userId=66, name=姓名11, address=地址66, createTime=Sun Jan 10 21:12:45 CST 2016, age=10, uuid=null), User(userId=11, name=姓名11, address=地址8888, createTime=null, age=0, uuid=null)], true=[User(userId=11, name=姓名11, address=地址11, createTime=Thu Jul 09 21:12:45 CST 2020, age=20, uuid=null), User(userId=22, name=姓名22, address=地址22, createTime=Sun Aug 09 21:12:45 CST 2020, age=21, uuid=null), User(userId=33, name=姓名33, address=地址33, createTime=Fri Jul 10 21:12:45 CST 2020, age=30, uuid=null), User(userId=44, name=姓名44, address=地址44, createTime=null, age=20, uuid=null), User(userId=11, name=姓名11, address=地址77777, createTime=null, age=26, uuid=null)]} //按照年齡是否大于11歲 分組 Map<Boolean, List<User>> map8 = list1.stream().collect(Collectors.partitioningBy(s -> s.getAge() > 11));//輸出結果 {false=[User(userId=11, name=姓名11, address=地址8888, createTime=null, age=0, uuid=null), User(userId=66, name=姓名11, address=地址66, createTime=Sun Jan 10 21:12:45 CST 2016, age=10, uuid=null)], true=[User(userId=11, name=姓名11, address=地址11, createTime=Thu Jul 09 21:12:45 CST 2020, age=20, uuid=null), User(userId=11, name=姓名11, address=地址77777, createTime=null, age=26, uuid=null), User(userId=33, name=姓名33, address=地址33, createTime=Fri Jul 10 21:12:45 CST 2020, age=30, uuid=null), User(userId=22, name=姓名22, address=地址22, createTime=Sun Aug 09 21:12:45 CST 2020, age=21, uuid=null), User(userId=44, name=姓名44, address=地址44, createTime=null, age=20, uuid=null)]} //按照年齡是否大于11歲 分組 Map<Boolean, Set<User>> map9 = list1.stream().collect(Collectors.partitioningBy(s -> s.getAge() > 11, Collectors.toSet()));數據連接
joining
描述:對String類型的元素進行聚合,拼接成一個字符串返回,作用與java.lang.String#join類似,提供了 3 個不同重載方法,可以實現不同的需要
返回類型:String
//輸出結果 java張三李四 String q = Stream.of("java", "張三", "李四").collect(Collectors.joining());//輸出結果 java, 張三, 李四 String w =Stream.of("java", "張三", "李四").collect(Collectors.joining(", "));//輸出結果 【java, 張三, 李四】 String t =Stream.of("java", "張三", "李四").collect(Collectors.joining(", ", "【", "】"));操作鏈
collectingAndThen
描述:它是先對集合進行一次聚合操作,然后通過Function定義的函數,對聚合后的結果再次處理。
返回類型:Map<K,V>
 示例也可以查看這個:collectingAndThen的應用例子
先操作后聚合
mapping
描述:mapping先通過Function函數處理數據,然后通過Collector方法聚合元素
返回類型:T
//輸出結果 [姓名11, 姓名22, 姓名33, 姓名44, 姓名11, 姓名11, 姓名11] //獲取name列表 List<String> list8= list1.stream().collect(Collectors.mapping(User::getName, Collectors.toList()));System.out.println(list8);先聚合后操作
reducing
描述: reducing提供了 3 個重載方法:
 示例也可以查看這個:reducing的使用例子
數據統計
counting
描述:統計元素列表的數量
 返回類型:Long
averagingDouble、averagingInt、averagingLong
描述:統計元素列表的平均值
 返回類型:3種方法都是Double
summingDouble、summingInt、summingLong
描述:統計元素列表的和
 返回類型:summingDouble返回的是Double類型、summingInt返回的是Integer類型,summingLong返回的是Long類型。
maxBy、minBy
描述:統計元素列表的最大值/最小值
 返回類型:Optional<T>
summarizingDouble、summarizingInt、summarizingLong
描述:統計元素列表的和
 返回類型:summarizingDouble返回DoubleSummaryStatistics類型,summarizingInt返回IntSummaryStatistics類型,summarizingLong返回LongSummaryStatistics類型。
總結
以上是生活随笔為你收集整理的Stream操作时Collectors工具类中常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Rhino
 - 下一篇: webpack 效率及性能提升