日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Stream操作时Collectors工具类中常用方法

發布時間:2023/12/29 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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>

//輸出結果 [姓名11, 姓名22, 姓名33, 姓名44, 姓名11, 姓名11, 姓名11] List<String> aa = list1.stream().map(User::getName).collect(Collectors.toList()); //輸出結果 [姓名11, 姓名22, 姓名33, 姓名44] Set<String> aa1 = list1.stream().map(User::getName).collect(Collectors.toSet()); //輸出結果 [姓名11, 姓名22, 姓名33, 姓名44] Collection<String> aa2 = list1.stream().map(User::getName).collect(Collectors.toCollection(TreeSet::new));

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的應用例子

//輸出結果 [{"address":"地址44","age":20,"name":"姓名44","userId":"44"},{"address":"地址33","age":30,"createTime":1594386765000,"name":"姓名33","userId":"33"},{"address":"地址22","age":21,"createTime":1596978765000,"name":"姓名22","userId":"22"},{"address":"地址8888","age":0,"name":"姓名11","userId":"11"}] //取出name相同的人中年齡最小的一個人 Map<String, User> collect = list1.stream().collect(Collectors.groupingBy(User::getName,Collectors.collectingAndThen(Collectors.reducing((c1, c2) -> c1.getAge()< c1.getAge() ? c1 : c2),Optional::get)));List<User> list6 = new ArrayList<>(collect.values());

先操作后聚合

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的使用例子

//:直接通過BinaryOperator操作,返回值是Optional public static <T> Collector<T, ?, Optional<T>> reducing(BinaryOperator<T> op)//:預定默認值,然后通過BinaryOperator操作 public static <T> Collector<T, ?, T> reducing(T identity, BinaryOperator<T> op)//:預定默認值,通過Function操作元素,然后通過BinaryOperator操作 public static <T, U> Collector<T, ?, U> reducing(U identity, Function<? super T, ? extends U> mapper, BinaryOperator<U> op) //輸出結果 Optional[127]//計算用戶的age總和Optional<Integer> te = list1.stream().map(User::getAge).collect(Collectors.reducing(Integer::sum));

數據統計

counting

描述:統計元素列表的數量
返回類型:Long

Long a = list1.stream().collect(Collectors.counting());

averagingDouble、averagingInt、averagingLong

描述:統計元素列表的平均值
返回類型:3種方法都是Double

Double b = list1.stream().collect(Collectors.averagingInt(User::getAge));

summingDouble、summingInt、summingLong

描述:統計元素列表的和
返回類型:summingDouble返回的是Double類型、summingInt返回的是Integer類型,summingLong返回的是Long類型。

//輸出結果 127 int c = list1.stream().collect(Collectors.summingInt(User::getAge));

maxBy、minBy

描述:統計元素列表的最大值/最小值
返回類型:Optional<T>

Optional<User> d = list1.stream().collect(Collectors.minBy(Comparator.comparing(User::getAge)));Optional<User> e = list1.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge)));

summarizingDouble、summarizingInt、summarizingLong

描述:統計元素列表的和
返回類型:summarizingDouble返回DoubleSummaryStatistics類型,summarizingInt返回IntSummaryStatistics類型,summarizingLong返回LongSummaryStatistics類型。

//輸出結果 IntSummaryStatistics{count=7, sum=127, min=0, average=18.142857, max=30} IntSummaryStatistics f = list1.stream().collect(Collectors.summarizingInt(User::getAge));

總結

以上是生活随笔為你收集整理的Stream操作时Collectors工具类中常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。