stream

image.png
  1. 中间操作(Intermediate Operations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。
  2. 终端操作(Terminal Operations):是指返回最终的结果。一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。
  3. 中间操作与结束操作,中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一
image.png

demo

        test1();
        test3();
    }

    //获取流的三步:
    //1. 创建stream
    //2. 中间操作
    //3. 终止stream

    // c创建stream有4种方法
    public static void test1(){
        //1  Collection系列创建stream
        List<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();

        //2 数组创建stream
        String[] array = new String[10];
        //Stream<String> stream1 = Arrays.stream(array);

        //3 stream.of
        Stream<String> stream2 = Stream.of("a","b");

        //4. 创建无线流
    }


    // 终止操作
    public static void test2(){
        Stream<String> stream2 = Stream.of("a","b");

        //void forEach(Consumer<? super T> action);
       // stream2.forEach((x) -> x = x + 1 );
        String b = "a" + 1;
        stream2.forEach(System.out::print);
        stream2.limit(1).forEach(System.out::print);

        List<Person> list = Arrays.asList(new Person(1),new Person(2),new Person(3));
        //filter的参数:Stream<T> filter(Predicate<? super T> predicate);
        Stream<Person> stream = list.stream().filter((e) -> e.getAge() > 2);
    }

    // 中间操作不会有任何结果,需要终止操作
    public static void test3() {

        List<Person> list = Arrays.asList(new Person(1), new Person(2), new Person(3));
        //filter的参数:Stream<T> filter(Predicate<? super T> predicate);
        Stream<Person> stream = list.stream().filter((e) -> {
            System.out.println("中间操作不会打印");
            return e.getAge() > 2;
        }).limit(2); //如果list有1万个, 只要找到符合条件的2个就停止遍历,也叫短路,提高效率
        stream.forEach(System.out::print);
    }
image.png
 //映射
    public static void test4(){
        List<Person> list = Arrays.asList(new Person(1), new Person(2), new Person(3));
        //map的参数是函数式接口:<R> Stream<R> map(Function<? super T, ? extends R> mapper);
        list.stream().map((x) -> x.getAge()).forEach(System.out::print);

        list.stream().map(Person::getAge).forEach(System.out::print);


    }

    //映射
    public static void test5(){
        List<String> list = Arrays.asList("aaa","bbb","ccc");
        Stream<Stream<Character>> stream = list.stream().map(TestStream1::filterChacter);
        stream.forEach((sm) ->{
            sm.forEach(System.out::print);
        });

        
        Stream<Character> stream2 = list.stream().flatMap(TestStream1::filterChacter);
    }

    public static Stream<Character> filterChacter(String str){
        List<Character> list = new ArrayList<>();
        for(Character c : str.toCharArray()){
            list.add(c);
        }
        return list.stream();
[图片上传中...(image.png-e5423c-1648230765636-0)]
    }
image.png
   //排序
    public static void test6() {
        List<String> list = Arrays.asList("aaa", "bbb", "ccc");
        list.stream().sorted().forEach(System.out::print);
    }

终止操作


image.png
   //终止、查找操作
    public static void test7() {
        List<String> list = Arrays.asList("aaa", "bbb", "ccc");

        //匹配所有的才返回true
        //参数:boolean anyMatch(Predicate<? super T> predicate);
        boolean matchAll = list.stream().allMatch((x) -> x.equals("aaaa"));

        boolean any = list.stream().anyMatch((x) -> x.equals("aaaa"));

        boolean none = list.stream().noneMatch((x) -> x.equals("aaaa"));

        Optional<String> op = list.stream().findFirst();
        String value = op.get();

        Optional<String> op2 = list.stream().findAny();
    }
[图片上传中...(image.png-a3f50f-1648309034182-0)]
image.png

规约


image.png
    //归并
    public static void test8() {
        List<Integer> list = Arrays.asList(1,2,3,4,5);

        //T reduce(T identity, BinaryOperator<T> accumulator);
        //因为有起始值,所以不会为空
        int totla = list.stream().reduce(0,(x,y)->x+y);

        //因为没有起始值,所有可能返回值会为空
        Optional<Integer> optional = list.stream().reduce(Integer::sum);
    }

//收集


image.png
   //收集
    public static void test9() {
        List<Person> list = Arrays.asList(new Person(1), new Person(2), new Person(3));

        List<Integer> ages = list.stream().map(Person::getAge).collect(Collectors.toList());

        Set<Integer> sets = list.stream().map(x -> x.getAge()).collect(Collectors.toSet());

        //Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
        HashSet<Integer> hs = list.stream().map(Person::getAge).collect(Collectors.toCollection(HashSet::new));
    }
image.png

//分组

    //分组
    public static void test10() {
        List<Person> list = Arrays.asList(new Person(1), new Person(2), new Person(3));

        //分组,可以是age,value是分组后的list
        //list.stream().collect(Collectors.groupingBy(x -> x.getAge()));
        Map<Integer,List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));

        //也支持多级分组,可以无限分下去
        Map<Integer,Map<Integer,List<Person>>> map2 = list.stream().collect(Collectors.groupingBy(Person::getAge,Collectors.groupingBy(Person::getAge)));

        String s = list.stream().map(x->x.getName()).collect(Collectors.joining(","));
    }
image.png

image.png

image.png

减少空指针异常


image.png

image.png

image.png
public interface TestInterface1 {

    default String getName(){
        return "aaaa";
    }

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

推荐阅读更多精彩内容