免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      「java8」阿里架構(gòu)師:Stream對(duì)集合的處理方式你全都知道了嗎?

      一、概述

      Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過(guò)濾和映射數(shù)據(jù)等操作。使用Stream API 對(duì)集合數(shù)據(jù)進(jìn)行操作,就類(lèi)似于使用 SQL 執(zhí)行的數(shù)據(jù)庫(kù)查詢(xún)。也可以使用 Stream API來(lái)并行執(zhí)行操作。簡(jiǎn)而言之,Stream API 提供了一種高效且易于使用的處理數(shù)據(jù)的方式。

      特點(diǎn):

      • 元素是特定類(lèi)型的對(duì)象,形成一個(gè)隊(duì)列。 Java中的Stream并不會(huì)存儲(chǔ)元素,而是按需計(jì)算。
      • 數(shù)據(jù)源 流的來(lái)源。 可以是集合,數(shù)組,I/O channel, 產(chǎn)生器generator 等。
      • 聚合操作 類(lèi)似SQL語(yǔ)句一樣的操作, 比如filter, map, reduce, find, match, sorted等。
      • Pipelining: 中間操作都會(huì)返回流對(duì)象本身。 這樣多個(gè)操作可以串聯(lián)成一個(gè)管道, 如同流式風(fēng)格(fluent style)。 這樣做可以對(duì)操作進(jìn)行優(yōu)化, 比如延遲執(zhí)行(laziness)和短路( short-circuiting)。
      • 內(nèi)部迭代: 以前對(duì)集合遍歷都是通過(guò)Iterator或者For-Each的方式, 顯式的在集合外部進(jìn)行迭代, 這叫做外部迭代。 Stream提供了內(nèi)部迭代的方式, 通過(guò)訪問(wèn)者模式(Visitor)實(shí)現(xiàn)。

      二、Stream的創(chuàng)建

      Stream可以通過(guò)集合數(shù)組創(chuàng)建。

      1、通過(guò) java.util.Collection.stream() 方法用集合創(chuàng)建流

      List list = Arrays.asList(1, 2, 3);// 創(chuàng)建一個(gè)順序流Stream stream = list.stream();// 創(chuàng)建一個(gè)并行流Stream parallelStream = list.parallelStream();

      2、使用java.util.Arrays.stream(T[] array)方法用數(shù)組創(chuàng)建流

      int[] array={1,3,5,6,8};IntStream stream = Arrays.stream(array);

      3、使用Stream的靜態(tài)方法:of()、iterate()、generate()(我不是很常用)

      Stream stream = Stream.of(1, 2, 3);// of內(nèi)部的方法,等同于使用數(shù)組創(chuàng)建流@SafeVarargs@SuppressWarnings(“varargs”) // Creating a stream from an array is safepublic static Stream of(T… values) {return Arrays.stream(values);}Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);stream2.forEach(System.out::print);System.out.println();Stream stream3 = Stream.generate(Math::random).limit(3);stream3.forEach(System.out::println);

      輸出結(jié)果:

      03690.49189549200548930.82466382643695550.17880449237798712

      將對(duì)象集合轉(zhuǎn)成對(duì)象中某個(gè)屬性的集合

      List list = new ArrayList();List ids = list.stream().map(ReviewerRest::getId).collect(Collectors.toList());復(fù)制代碼

      將某個(gè)屬性的集合轉(zhuǎn)成對(duì)象集合

      List ids = new ArrayList();List list = ids.stream().map(id -> {ReviewerRest rest = new ReviewerRest();rest.setRest(1);rest.setDate(LocalDate.now());rest.setReviewerId(1000L);return rest;}).collect(Collectors.toList());復(fù)制代碼

      判斷集合中是否有一個(gè)對(duì)象包含某個(gè)屬性

      boolean exist = list.stream().anyMatch(rest -> rest.getReviewerId().equals(1000L));//…… allMatch 和 anyMatch 類(lèi)似復(fù)制代碼

      對(duì)集合中某個(gè)對(duì)象的屬性求和

      BigDecimal reduce = list.stream().map(ReviewerRest::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);復(fù)制代碼

      集合轉(zhuǎn) Map (普通)

      Map map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x));復(fù)制代碼

      集合轉(zhuǎn) Map (key 存在重復(fù))

      當(dāng)集合中 id 會(huì)存在重復(fù)時(shí),上面那種方式會(huì)報(bào)錯(cuò),此時(shí)需要指定重復(fù)時(shí)選用哪一個(gè) value

      Map map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x, (before, after) -> after));復(fù)制代碼

      集合轉(zhuǎn) Map (value 存在 null 值)

      當(dāng) value 存在 null 值時(shí)上面那種方式會(huì)報(bào)錯(cuò),此時(shí)需要換一種寫(xiě)法

      Map map = list.stream().collect(HashMap::new, (mapItem, item) -> mapItem.put(item.getId(), item.getDate()), HashMap::putAll);復(fù)制代碼

      集合分組 轉(zhuǎn) Map

      Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId));復(fù)制代碼

      集合分區(qū) 轉(zhuǎn) Map

      Map map = list.stream().collect(Collectors.partitioningBy(r -> r.getRest() == 1));復(fù)制代碼

      集合分組個(gè)數(shù)統(tǒng)計(jì)

      Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.counting()));復(fù)制代碼

      集合分組轉(zhuǎn)某個(gè)屬性集合

      Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.mapping(ReviewerRest::getRest,Collectors.toList())));復(fù)制代碼

      集合分組聚合查詢(xún)最大元素

      Map map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.maxBy(Comparator.comparing(ReviewerRest::getDate))));復(fù)制代碼

      集合分組聚合求和

      //目前只支持 int、double、longMap map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.summingLong(

      java8采用stream對(duì)集合的常用操作

      User :{id,name,age}

      1.對(duì)象集合的分組(有兩種形式)示例:List userList,根據(jù)id分組,可以分組成為兩種格式的map(1)Map

      Map map = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

      (2)Map

      Map = userList.stream().collect(Collectors.groupingBy(User::getId));

      2.去重操作對(duì)List 實(shí)現(xiàn)去重,distinct關(guān)鍵字

      示例:userList= userList.stream().distinct().collect(Collectors.toList());

      3.stream的map主要用于得到特定的結(jié)構(gòu)例如:List userList,我向得到User Id的集合

      List idList = userList.stream.map(User::getId).collect(Collectors.toList());

      4.stream的filter主要用于數(shù)據(jù)的篩選。例1:一個(gè)條件的篩選,刪選id>5的User

      List userList = userList.stream.filter(i->i.getId()>5).collect(Collectors.toList());

      例2:兩個(gè)條件的刪選用&&連接就行,刪選id>5年紀(jì)>10的User

      List userList = userList.stream.filter(i->i.getId()>5&&i.getAge()>10).collect(Collectors.toList());

      5.用來(lái)作循環(huán)

      userList.stream().forEach(user -> System.out.println(“姓名:” + user.getName()));

      當(dāng)然也可以加個(gè)limit限制數(shù)量

      userList.stream().limit(2).forEach(user -> System.out.println(“姓名:” + user.getName()));

      6.最大值最小值

      int maxAge = userList.stream().mapToInt(User::getAge).max().getAsInt(); int minAge = userList.stream().mapToInt(User::getAge).min().getAsInt();

      封裝的Stream使用類(lèi),可以直接拿走使用:

      public class StreamUtils {/** * 集合為空,創(chuàng)建空的Stream流;否則創(chuàng)建集合的Stream流 * 避免出現(xiàn)空指針 * * @param collection 集合 * @param集合元素的泛型 * @return Stream對(duì)象 */private staticStream streamOf(Collection collection) {return CollectionUtils.isEmpty(collection) ? Stream.empty() : collection.stream();}/** * 按照映射規(guī)則映射成一個(gè)新的集合流 * * @param list集合 * @param mapper 集合屬性元素 * @param函數(shù)輸入類(lèi)型的泛型 * @param函數(shù)結(jié)果類(lèi)型的泛型 * @return新的集合 */public staticList mapList(List list, Function mapper) {return streamOf(list).map(mapper).collect(Collectors.toList());}/** * 根據(jù)給定的條件進(jìn)行篩選,將符合條件的元素提取成新的流 * * @param list集合 * @param predicate 篩選規(guī)則 * @param流元素的類(lèi)型 * @return符合條件的流集合 */public staticList filter(List list, Predicate predicate) {return streamOf(list).filter(predicate).collect(Collectors.toList());}/** * 根據(jù)給定的條件進(jìn)行篩選,將符合條件的元素提取成新的流 * * @param list集合 * @param predicates多個(gè)篩選條件 * @param流元素的類(lèi)型 * @return 符合條件的流集合 */@SafeVarargspublic staticList filters(List list, Predicate … predicates) {Stream stream = streamOf(list);for (Predicate predicate : predicates) {stream = stream.filter(predicate);}return stream.collect(Collectors.toList());}/** * 根據(jù)指定元素對(duì)集合進(jìn)行升序排序 * * @param list集合 * @param keyExtractor用來(lái)排序的元素 * @param函數(shù)輸入類(lèi)型的泛型 * @param函數(shù)結(jié)果類(lèi)型的泛型 * @return排序后的集合 */public static List sorted(List list, Function keyExtractor) {return streamOf(list).sorted(Comparator.comparing(keyExtractor)).collect(Collectors.toList());}/** * 根據(jù)指定元素對(duì)集合進(jìn)行升序排序 * * @param list集合 * @param keyExtractor用來(lái)排序的元素 * @param limit 排序后集合中保留的數(shù)量 * @param函數(shù)輸入類(lèi)型的泛型 * @param函數(shù)結(jié)果類(lèi)型的泛型 * @return排序后的集合 */public static List sorted(List list, Function keyExtractor, Integer limit) {return streamOf(list).sorted(Comparator.comparing(keyExtractor)).limit(limit).collect(Collectors.toList());}/** * 根據(jù)指定元素對(duì)集合進(jìn)行降序排序 * * @param list集合 * @param keyExtractor用來(lái)排序的元素 * @param函數(shù)輸入類(lèi)型的泛型 * @param函數(shù)結(jié)果類(lèi)型的泛型 * @return排序后的集合 */public static List sortedDesc(List list, Function keyExtractor) {return streamOf(list).sorted(Comparator.comparing(keyExtractor).reversed()).collect(Collectors.toList());}/** *根據(jù)規(guī)則判斷元素是否匹配 * * @param list集合 * @param predicate 匹配規(guī)則 * @param元素類(lèi)型 * @return匹配結(jié)果 */public staticboolean anyMatch(List list, Predicate predicate) {return streamOf(list).anyMatch(predicate);}/** * 將List集合轉(zhuǎn)換成Map集合,同一個(gè)key時(shí)對(duì)value進(jìn)行去重,保留第一個(gè)出現(xiàn)的value值 * * @param list集合 * @param keyMapper 新的Map中的key * @param參數(shù)的類(lèi)型 * @return轉(zhuǎn)換后的Map集合*/public staticMap toMapDistinctFirst(List list, Function keyMapper) {return streamOf(list).collect(Collectors.toMap(keyMapper, Function.identity(), (key1, key2) -> key1));}/** * 將List集合轉(zhuǎn)換成Map集合,同一個(gè)key時(shí)對(duì)value進(jìn)行去重,保留最后出現(xiàn)的value值 * * @param list集合 * @param keyMapper 新的Map中的key * @param參數(shù)的類(lèi)型 * @return轉(zhuǎn)換后的Map集合*/public staticMap toMapDistinctLast(List list, Function keyMapper) {return streamOf(list).collect(Collectors.toMap(keyMapper, Function.identity(), (key1, key2) -> key2));}/** * 將List轉(zhuǎn)換為指定key->value鍵值對(duì)元素的Map集合 * @param list集合 * @param keyMapper Map的key元素 * @param valueMapper Map的value元素 * @param函數(shù)輸入的類(lèi)型 * @param函數(shù)輸出的類(lèi)型 * @param函數(shù)輸出的類(lèi)型 * @return轉(zhuǎn)換后的Map集合*/public staticMap toMap(List list, Function keyMapper,Function valueMapper) {return streamOf(list).collect(Collectors.toMap(keyMapper, valueMapper));}}

      最后希望大家能從文章中得到幫助獲得收獲,也可以評(píng)論出你想看哪方面的技術(shù)。文章會(huì)持續(xù)更新,希望能幫助到大家,哪怕是讓你靈光一現(xiàn)。喜歡的朋友可以點(diǎn)點(diǎn)贊和關(guān)注,也可以分享出去讓更多的人看見(jiàn),一起努力一起進(jìn)步!

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
      用戶(hù)投稿
      上一篇 2022年9月20日 06:12
      下一篇 2022年9月20日 06:13

      相關(guān)推薦

      • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

        今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

        2022年11月26日
      • 《原神》3.2無(wú)相交響詩(shī)第一天無(wú)相之冰怎么打?無(wú)相交響詩(shī)攻略

        原神3.2無(wú)相交響詩(shī)第一天無(wú)相之冰怎么打?最近新版本3.2版本的無(wú)相交響詩(shī)活動(dòng)又開(kāi)啟了,不少玩家還不清楚具體的玩法,下面一起來(lái)看一下原神被隱去的原神3.2無(wú)相交響詩(shī)第一天無(wú)相之冰打…

        2022年11月24日
      • 《原神》畫(huà)外旅照青植之篇第七天怎么過(guò)?畫(huà)外旅照第七天玩法介紹

        原神的畫(huà)外旅照任務(wù)需要玩家達(dá)成一定的要求進(jìn)行拍照,完成任務(wù)可以獲得獎(jiǎng)勵(lì)。很多玩家想知道原神畫(huà)外旅照青植之篇第七天怎么過(guò),下面就帶來(lái)原神畫(huà)外旅照第七天玩法介紹,感興趣的小伙伴不要錯(cuò)過(guò)…

        2022年11月23日
      • 京東店鋪類(lèi)型有哪些京東入駐有什么資質(zhì)要求

        今天的互聯(lián)網(wǎng)發(fā)展迅速,讓傳統(tǒng)企業(yè)有了更多選擇,但也同樣也對(duì)剛觸網(wǎng)的商家增添了許多迷茫,近日知舟電商就收到很多商家朋友詢(xún)問(wèn)京東入駐相關(guān)問(wèn)題,今天知舟君就給大家分享下。 一.京東入駐準(zhǔn)…

        2022年11月18日
      • 我的世界交錯(cuò)次元水藍(lán)元素寶石怎么獲得?黑暗沼澤水藍(lán)元素寶石獲得方法

        我的世界交錯(cuò)次元水藍(lán)元素寶石怎么獲得?我的世界交錯(cuò)次元水藍(lán)元素寶石獲取方法是什么?很多玩家不知道,交錯(cuò)次元mod有很多道具跟裝備都需要技巧獲得,水藍(lán)元素寶石用消耗凈化器中存儲(chǔ)的1桶…

        2022年11月17日
      • 原神淥華池之影拍照位置攻略 畫(huà)外旅照青植第一天通關(guān)技巧

        原神淥華池之影拍照是很多玩家關(guān)心的,這個(gè)是畫(huà)外旅照青植第一天的拍攝主題。因此想要知道這個(gè)過(guò)關(guān)攻略是什么的小伙伴們,其實(shí)這個(gè)操作方法還是很容易的,想要知道的小伙伴們,就一起來(lái)看看吧。…

        2022年11月17日
      • 原神畫(huà)外旅照病師怎么拍照 病師留影攻略

        原神畫(huà)外旅照活動(dòng)正在進(jìn)行中,第一張照片的命題是病師,玩家根據(jù)描述前往指定地方拍照完成任務(wù),那原神畫(huà)外旅照病師怎么拍照, 小編為大家?guī)?lái)病師留影攻略。 原神畫(huà)外旅照病師怎么拍照 第一…

        2022年11月17日
      • 怎么刪除自己的追評(píng)(淘寶追評(píng)可以刪除嗎)

        一、淘寶店鋪每個(gè)評(píng)價(jià)類(lèi)型的處理方案都是不同的,那具體哪些評(píng)價(jià)類(lèi)型該如何區(qū)分呢? 1、主評(píng)為好評(píng)時(shí):不支持修改或者刪除評(píng)價(jià)的,若中評(píng)/差評(píng)改為好評(píng),也不可修改或刪除 ; 2、當(dāng)主評(píng)為…

        2022年11月17日
      • 排名前十的小說(shuō)(排名前十的小說(shuō)完結(jié))

        本文主要講的是排名前十的小說(shuō),以及和排名前十的小說(shuō)完結(jié)相關(guān)的知識(shí),如果覺(jué)得本文對(duì)您有所幫助,不要忘了將本文分享給朋友。 小說(shuō)排行榜2022前十名完結(jié)(十大必看網(wǎng)絡(luò)小說(shuō)排行榜每本都是…

        2022年11月14日
      • 稀土是什么(稀土是什么樣子圖片)

        稀土是一組金屬的簡(jiǎn)稱(chēng),包括化學(xué)元素周期表第三副族中稱(chēng)為鑭系元素的鑭鈰鐠釹钷釤銪釓鋱鏑鈥鉺銩鐿镥,以及性質(zhì)與其相近的鈧和釔從1794年發(fā)現(xiàn)元素釔,到1992年發(fā)現(xiàn)自然界中的稀土元素;…

        2022年11月10日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息