Java Stream基礎(chǔ)入門讓你大概了解這個(gè)工具的使用

private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }

    public static void distinct() {
        List<String> strings = List.of("2", "2", "2", "1" , "2", "3", "4", "5", "6");
        System.err.println("-----------------");
        System.err.println(strings.stream());
        System.err.println(strings.stream().count());
        System.err.println(strings.stream().findAny().get());
        System.err.println(strings.stream().findFirst().get());

        System.err.println("-----------------");
        System.err.println(strings.stream().collect(Collectors.joining()));
        System.err.println(strings.stream().collect(Collectors.joining(",")));
        System.err.println(strings.stream().collect(Collectors.joining(",", "{", "}")));

        System.err.println("-----------------toMap");
        //使用Function.identity()如果遇到重復(fù)key會(huì)報(bào)錯(cuò)暮顺。
        //System.err.println(strings.stream().collect(Collectors.toMap(v -> v,Function.identity())));
        System.err.println(strings.stream().collect(Collectors.toMap(v -> v, dto -> dto, (olds, news) -> news)));


        System.err.println("-----------------統(tǒng)計(jì)出現(xiàn)個(gè)數(shù)");
        System.err.println(strings.stream().collect(Collectors.groupingBy(num -> num, Collectors.counting())));
        System.err.println("-----------------排序叹括,正序");
        System.err.println(strings.stream().sorted().collect(Collectors.joining()));
        System.err.println("-----------------排序,逆序");
        System.err.println(strings.stream().sorted(Comparator.reverseOrder()).collect(Collectors.joining()));
        System.err.println("-----------------排序匕荸,自定義規(guī)則");
        System.err.println(strings.stream().sorted(Comparator.comparing(m -> "asd" + m, Comparator.reverseOrder())).collect(Collectors.joining()));


        System.err.println("-----------------偷瞄");
        System.err.println(strings.stream().filter(d -> Objects
                .equals("2", d))
                .peek(d -> System.err.print(d + ","))
                .collect(Collectors.joining()));


        /*
            1.Instant.now():通過這種方式獲取的時(shí)間戳與北京時(shí)間相差8個(gè)時(shí)區(qū)递瑰,需要修正為北京時(shí)間祟牲,
                通過查看源代碼發(fā)現(xiàn)Instant.now()使用等是UTC時(shí)間Clock.systemUTC().instant()。LocalDate抖部、LocalDateTime 的now()方法使用的是系統(tǒng)默認(rèn)時(shí)區(qū) 不存在Instant.now()的時(shí)間問題说贝。
            2..stream()                                     串行流,當(dāng)前線程按順序執(zhí)行慎颗。
            3..stream().parallel()                          并行流乡恕,使用ForkJoinPool框架并行執(zhí)行代碼换淆,不能保證順序。
            4..stream().parallel().forEachOrdered()         最終是串行執(zhí)行几颜,使用ForkJoinPool中的某一個(gè)線程串行執(zhí)行,forEachOrdered中的代碼讯屈。

            用并行流需要避免去訪問公共資源蛋哭,最好使用collect()去構(gòu)建新集合。
         */
        System.err.println("-----------------普通流涮母,串行執(zhí)行");
        strings.stream().forEach(d -> {
            Consumer c = System.err::println;
            c.accept(Thread.currentThread().getName() + ":" + d + ":" + Instant.now().getEpochSecond());
            try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); }
        });
        System.err.println("-----------------并行流谆趾,可通過啟動(dòng)參數(shù)設(shè)置worker的數(shù)量 -Djava.util.concurrent.ForkJoinPool.common.parallelism=N \n");
        strings.stream().parallel().forEach(d -> {
            Consumer c = System.err::println;
            c.accept(Thread.currentThread().getName() + ":" + d + ":" + Instant.now().getEpochSecond());
            try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
        });
        System.err.println("-----------------forEachOrdered,并行執(zhí)行后,再按順序處理");
        strings.stream().parallel().forEachOrdered(d -> {
            Consumer c = System.err::println;
            c.accept(Thread.currentThread().getName() + ":" + d + ":" + Instant.now().getEpochSecond());
            try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); }
        });

        System.err.println("-----------------sequential:從并行流轉(zhuǎn)換為順序流叛本,這是個(gè)中間操作");
        System.err.println("default    -> " + strings.stream().isParallel());
        System.err.println("sequential -> " + strings.stream().sequential().isParallel());
        System.err.println("parallel   -> " + strings.stream().parallel().isParallel());

        System.err.println("-----------------Limit");
        strings.stream().limit(2).forEach(System.err::print);
        System.err.println("---------------------------------------------------");
        System.err.println();
        System.err.println("-----------------allMatch,全部符合條件");
        System.err.println(strings.stream().allMatch(d -> "2".equals(d)));
        System.err.println("-----------------anyMatch,只需要一個(gè)符合條件");
        System.err.println(strings.stream().anyMatch(d -> "2".equals(d)));
        System.err.println("-----------------noneMatch,沒有一個(gè)符合條件");
        System.err.println(strings.stream().noneMatch(d -> "2".equals(d)));

        System.err.println("---------------------------------------------------");
        /**
         * 2,2,2,1,3,2,2
         * dropWhile(n -> n == 2)
         * @retrun 1,3,2,2
         *
         * 2,2,2,1,3,2,2
         * takeWhile(n -> n == 2)
         * @retrun 2,2,2
         *
         */
        System.err.println("-----------------dropWhile,API的dropWhile()方法丟棄所有值沪蓬,直到謂詞 返回false為止,后面就算匹配也不處理");
        System.err.println(strings.stream().dropWhile(x -> Integer.valueOf(x) == 2).collect(Collectors.toList()));
        System.err.println("-----------------takeWhile,API的takeWhile() 方法接受所有值,直到謂詞 返回false為止,后面就算匹配也不處理");
        System.err.println(strings.stream().takeWhile(x -> Integer.valueOf(x) == 2).collect(Collectors.toList()));

        System.err.println("-----------------max");
        strings.stream().max(Comparator.naturalOrder()).ifPresent(System.err::println);
        System.err.println("-----------------min");
        strings.stream().min(Comparator.naturalOrder()).ifPresent(((Consumer)System.err::println).andThen(d -> System.err.println("----------------------")));


        System.err.println("----------------------reduce");
        Stream.of(1, 2, 3, 4, 1).reduce((acc, item) -> {
            System.out.print("acc : " + acc);
            System.out.print("  item: " + item);
            System.out.println("  new_acc : " + (acc += item));
            return acc;
        }).ifPresent(((Consumer)System.err::println).andThen(d -> System.err.println("----------------------reduce")));

    }
D:\job\jdk-11.0.7\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=55382:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\code\leetcode\target\classes;E:\storage\org\springframework\boot\spring-boot-starter\2.4.4\spring-boot-starter-2.4.4.jar;E:\storage\org\springframework\boot\spring-boot\2.4.4\spring-boot-2.4.4.jar;E:\storage\org\springframework\spring-context\5.3.5\spring-context-5.3.5.jar;E:\storage\org\springframework\boot\spring-boot-autoconfigure\2.4.4\spring-boot-autoconfigure-2.4.4.jar;E:\storage\org\springframework\boot\spring-boot-starter-logging\2.4.4\spring-boot-starter-logging-2.4.4.jar;E:\storage\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\storage\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\storage\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;E:\storage\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;E:\storage\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;E:\storage\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\storage\org\springframework\spring-core\5.3.5\spring-core-5.3.5.jar;E:\storage\org\springframework\spring-jcl\5.3.5\spring-jcl-5.3.5.jar;E:\storage\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;E:\storage\org\springframework\boot\spring-boot-starter-web\2.4.4\spring-boot-starter-web-2.4.4.jar;E:\storage\org\springframework\boot\spring-boot-starter-json\2.4.4\spring-boot-starter-json-2.4.4.jar;E:\storage\com\fasterxml\jackson\core\jackson-databind\2.11.4\jackson-databind-2.11.4.jar;E:\storage\com\fasterxml\jackson\core\jackson-annotations\2.11.4\jackson-annotations-2.11.4.jar;E:\storage\com\fasterxml\jackson\core\jackson-core\2.11.4\jackson-core-2.11.4.jar;E:\storage\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.4\jackson-datatype-jdk8-2.11.4.jar;E:\storage\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.4\jackson-datatype-jsr310-2.11.4.jar;E:\storage\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.4\jackson-module-parameter-names-2.11.4.jar;E:\storage\org\springframework\boot\spring-boot-starter-tomcat\2.4.4\spring-boot-starter-tomcat-2.4.4.jar;E:\storage\org\apache\tomcat\embed\tomcat-embed-core\9.0.44\tomcat-embed-core-9.0.44.jar;E:\storage\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;E:\storage\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.44\tomcat-embed-websocket-9.0.44.jar;E:\storage\org\springframework\spring-web\5.3.5\spring-web-5.3.5.jar;E:\storage\org\springframework\spring-beans\5.3.5\spring-beans-5.3.5.jar;E:\storage\org\springframework\spring-webmvc\5.3.5\spring-webmvc-5.3.5.jar;E:\storage\org\springframework\spring-expression\5.3.5\spring-expression-5.3.5.jar;E:\storage\org\springframework\boot\spring-boot-starter-aop\2.4.4\spring-boot-starter-aop-2.4.4.jar;E:\storage\org\springframework\spring-aop\5.3.5\spring-aop-5.3.5.jar;E:\storage\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar;E:\storage\com\google\guava\guava\30.1.1-jre\guava-30.1.1-jre.jar;E:\storage\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;E:\storage\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;E:\storage\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;E:\storage\org\checkerframework\checker-qual\3.8.0\checker-qual-3.8.0.jar;E:\storage\com\google\errorprone\error_prone_annotations\2.5.1\error_prone_annotations-2.5.1.jar;E:\storage\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;E:\storage\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar com.casa.leetcode.stream.Distinct
-----------------
java.util.stream.ReferencePipeline$Head@5d624da6
9
2
2
-----------------
222123456
2,2,2,1,2,3,4,5,6
{2,2,2,1,2,3,4,5,6}
-----------------toMap
{1=1, 2=2, 3=3, 4=4, 5=5, 6=6}
-----------------統(tǒng)計(jì)出現(xiàn)個(gè)數(shù)
{1=1, 2=4, 3=1, 4=1, 5=1, 6=1}
-----------------排序来候,正序
122223456
-----------------排序跷叉,逆序
654322221
-----------------排序,自定義規(guī)則
654322221
-----------------偷瞄
2,2,2,2,2222
-----------------普通流营搅,串行執(zhí)行
main:2:1625126462
main:2:1625126462
main:2:1625126462
main:1:1625126462
main:2:1625126462
main:3:1625126462
main:4:1625126462
main:5:1625126462
main:6:1625126462
-----------------并行流云挟,可通過啟動(dòng)參數(shù)設(shè)置worker的數(shù)量 -Djava.util.concurrent.ForkJoinPool.common.parallelism=N 

main:3:1625126462
ForkJoinPool.commonPool-worker-7:2:1625126462
ForkJoinPool.commonPool-worker-9:4:1625126462
ForkJoinPool.commonPool-worker-3:2:1625126462
ForkJoinPool.commonPool-worker-5:5:1625126462
ForkJoinPool.commonPool-worker-11:1:1625126462
ForkJoinPool.commonPool-worker-7:2:1625126463
ForkJoinPool.commonPool-worker-5:6:1625126463
ForkJoinPool.commonPool-worker-3:2:1625126463
-----------------forEachOrdered,并行執(zhí)行后,再按順序處理
ForkJoinPool.commonPool-worker-11:2:1625126463
ForkJoinPool.commonPool-worker-11:2:1625126463
ForkJoinPool.commonPool-worker-11:2:1625126463
ForkJoinPool.commonPool-worker-11:1:1625126463
ForkJoinPool.commonPool-worker-11:2:1625126463
ForkJoinPool.commonPool-worker-11:3:1625126463
ForkJoinPool.commonPool-worker-11:4:1625126463
ForkJoinPool.commonPool-worker-11:5:1625126463
ForkJoinPool.commonPool-worker-11:6:1625126463
-----------------sequential:從并行流轉(zhuǎn)換為順序流转质,這是個(gè)中間操作
default    -> false
sequential -> false
parallel   -> true
-----------------Limit
22---------------------------------------------------

-----------------allMatch,全部符合條件
false
-----------------anyMatch,只需要一個(gè)符合條件
true
-----------------noneMatch,沒有一個(gè)符合條件
false
---------------------------------------------------
-----------------dropWhile,API的dropWhile()方法丟棄所有值园欣,直到謂詞 返回false為止,后面就算匹配也不處理
[1, 2, 3, 4, 5, 6]
-----------------takeWhile,API的takeWhile() 方法接受所有值,直到謂詞 返回false為止,后面就算匹配也不處理
[2, 2, 2]
-----------------max
6
-----------------min
1
----------------------
----------------------reduce
11
----------------------reduce
acc : 1  item: 2  new_acc : 3
acc : 3  item: 3  new_acc : 6
acc : 6  item: 4  new_acc : 10
acc : 10  item: 1  new_acc : 11

Process finished with exit code 0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末休蟹,一起剝皮案震驚了整個(gè)濱河市沸枯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赂弓,老刑警劉巖武学,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘嫉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)女责,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尼桶,“玉大人堡妒,你說我怎么就攤上這事“唇牛” “怎么了于毙?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辅搬。 經(jīng)常有香客問我唯沮,道長(zhǎng)脖旱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任介蛉,我火速辦了婚禮萌庆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘币旧。我一直安慰自己践险,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布吹菱。 她就那樣靜靜地躺著巍虫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳍刷。 梳的紋絲不亂的頭發(fā)上占遥,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音输瓜,去河邊找鬼瓦胎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尤揣,可吹牛的內(nèi)容都是我干的凛捏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼芹缔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坯癣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起最欠,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤示罗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后芝硬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚜点,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年拌阴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绍绘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迟赃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纤壁,到底是詐尸還是另有隱情左刽,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布酌媒,位于F島的核電站欠痴,受9級(jí)特大地震影響迄靠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喇辽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一掌挚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菩咨,春花似錦吠式、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雏亚。三九已至缨硝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罢低,已是汗流浹背查辩。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留网持,地道東北人宜岛。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像功舀,于是被迫代替她去往敵國(guó)和親萍倡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容