Java Stream基础入门让你大概了解这个工具的使用

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()如果遇到重复key会报错。
        //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("-----------------统计出现个数");
        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("-----------------排序,自定义规则");
        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():通过这种方式获取的时间戳与北京时间相差8个时区,需要修正为北京时间,
                通过查看源代码发现Instant.now()使用等是UTC时间Clock.systemUTC().instant()。LocalDate、LocalDateTime 的now()方法使用的是系统默认时区 不存在Instant.now()的时间问题。
            2..stream()                                     串行流,当前线程按顺序执行。
            3..stream().parallel()                          并行流,使用ForkJoinPool框架并行执行代码,不能保证顺序。
            4..stream().parallel().forEachOrdered()         最终是串行执行,使用ForkJoinPool中的某一个线程串行执行,forEachOrdered中的代码。

            用并行流需要避免去访问公共资源,最好使用collect()去构建新集合。
         */
        System.err.println("-----------------普通流,串行执行");
        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("-----------------并行流,可通过启动参数设置worker的数量 -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,并行执行后,再按顺序处理");
        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:从并行流转换为顺序流,这是个中间操作");
        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,只需要一个符合条件");
        System.err.println(strings.stream().anyMatch(d -> "2".equals(d)));
        System.err.println("-----------------noneMatch,没有一个符合条件");
        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}
-----------------统计出现个数
{1=1, 2=4, 3=1, 4=1, 5=1, 6=1}
-----------------排序,正序
122223456
-----------------排序,逆序
654322221
-----------------排序,自定义规则
654322221
-----------------偷瞄
2,2,2,2,2222
-----------------普通流,串行执行
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
-----------------并行流,可通过启动参数设置worker的数量 -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,并行执行后,再按顺序处理
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:从并行流转换为顺序流,这是个中间操作
default    -> false
sequential -> false
parallel   -> true
-----------------Limit
22---------------------------------------------------

-----------------allMatch,全部符合条件
false
-----------------anyMatch,只需要一个符合条件
true
-----------------noneMatch,没有一个符合条件
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容