java8-stream流

首先,Stream流有一些特性:
1 .Stream流不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作。
2.这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。
3.Stream不保存数据,故每个Stream流只能使用一次。

Stream 的操作分为三种:
1.创建stream流。
2.中间操作。
3.终止操作。
演示代码下载地址:https://github.com/prettyRain/java8demo.git

1.创建stream

  • 1)Collection接口的stream()或parallelStream()方法
  • 2)Arrays.stream(array)
  • 3)静态的Stream.iterate()方法生成无限流,接受一个种子值以及一个迭代函数
  • 4)静态的Stream.generate()方法生成无限流,接受一个不包含引元的函数
/**
     * 创建 stream
     */
    @Test
    public void test1(){
        //1.Collection提供了两个方法  stream() 和 parallelStream()
        List<String> list = new ArrayList<String>();
        Stream<String> stream = list.stream();
        Stream<String> stringStream = list.parallelStream();

        //2.通过Arrays中的stream()获取一个数组流
        Integer[] nums = new Integer[10];
        Stream<Integer> stream1 = Arrays.stream(nums);

        //3.通过stream类中的静态方法 of()
        Stream<Integer> stream2 = Stream.of(1,2,3,4,5);

        //4.创建无限流
        //迭代
        Stream<Integer> stream3 = Stream.iterate(2,(x) -> x+2).limit(5);
        stream3.forEach(System.out::println);
        //生成   里面是供给型
        Stream<Double> stream4 = Stream.generate(Math::random).limit(2);
        //里面是消费型
        stream4.forEach(System.out::println);
    }

2.中间操作:

切片和筛选:

  • 1)filter——接收 Lambda , 从流中排除某些元素。
  • 2)limit——截断流,使其元素不超过给定数量。
  • 3)skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
  • 4)distinct——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
  • 5)sorted()——自然排序
  • 6)sorted(Comparator com)——定制排序
    映射:
  • 1)map——接收 Lambda , 将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
  • 2)flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
public class TestStream2 {
    Student[]  aa = new Student[]{new Student(1L,"小明","男",18,new BigDecimal(5000)),
            new Student(2L,"小花","女",12,new BigDecimal(6000)),
            new Student(3L,"小李","男",10,new BigDecimal(3000)),
            new Student(4L,"小刘","男",17,new BigDecimal(9000)),
            new Student(5L,"小刚","男",13,new BigDecimal(8000))};
    /**
     *    filter——接收 Lambda , 从流中排除某些元素。
     *    limit——截断流,使其元素不超过给定数量。
     *    skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
     *    distinct——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
     */
    //内部迭代
    @Test
    public void test1(){
        //所有的中间操作不会做任何的处理
        Stream<Student> stream = Arrays.stream(aa)
                .filter((e) -> e.getAge() > 12l)
                .limit(3)
                .distinct()
                .skip(1);
        //只有当终止操作时,所有的操作才会一次性执行,称为“惰性求值”
        stream.forEach(System.out::println);
    }

    /**
     *    map——接收 Lambda , 将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
     *    flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
     */
     @Test
     public void test2(){

         Stream<Student> studentStream = Arrays.stream(aa);
         studentStream.map( (t) -> t.getName())
                 .forEach(System.out::println);

         List<String> strings = Arrays.asList("aa", "bb", "cc", "dd");
         Stream<String> stream = strings.stream()
                       .map(String::toUpperCase);
          stream.forEach(System.out::println);

         //map流中有流
         Stream<Stream<String>> stream1 = strings.stream()
                 .map(TestStream2::getstream);
         stream1.forEach(xs -> xs.forEach(System.out::println));

         //flatMap 把所有流连成一个流
         Stream<String> stream2 = strings.stream()
                 .flatMap(TestStream2::getstream);
         stream2.forEach(System.out::println);
     }

     public static Stream<String> getstream(String str){
         List<String> list = new ArrayList<>();
         char[] chars = str.toCharArray();
         for(int i = 0 ; i < chars.length ; i++){
             list.add(String.valueOf(chars[i]));
         }
         return list.stream();
     }

    /**
     * sorted()——自然排序
     * sorted(Comparator com)——定制排序
     */
    @Test
     public void test3(){
         Stream<Student> stream = Arrays.stream(aa);
         stream.map(x -> x.getName())
               .sorted()
               .forEach(System.out::println);

        Arrays.stream(aa).sorted((x,y) -> {
                   if(x.getAge()==y.getAge()){
                       return x.getName().compareTo(y.getName());
                   }else{
                       return Integer.compare(x.getAge(),y.getAge());
                   }
                })
              .forEach(System.out::println);
    }
}

3.终止操作

  • 1) allMatch——检查是否匹配所有元素
  • 2) anyMatch——检查是否至少匹配一个元素
  • 3)noneMatch——检查是否没有匹配的元素 没有匹配返回true
  • 4)findFirst——返回第一个元素
  • 5)findAny——返回当前流中的任意元素
  • 6)count——返回流中元素的总个数
  • 7)max——返回流中最大值
  • 8)min——返回流中最小值
  • 9) reduce(T identity, BinaryOperator) / reduce(BinaryOperator)--规约可以将流中元素反复结合起来,得到一个值。
  • 10)collect--收集 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
public class TestStream3 {

    public List<Student> bb = Arrays.asList(new Student(1L,"小明","男",18,new BigDecimal(5000)),
            new Student(2L,"小花","女",17,new BigDecimal(6000)),
            new Student(3L,"小李","男",10,new BigDecimal(3000)),
            new Student(4L,"小刘","男",17,new BigDecimal(9000)),
            new Student(5L,"小刚","男",13,new BigDecimal(8000)));

    /**
     * allMatch/anyMatch/noneMatch/findFirst/findAny/count/max/min
     */
    @Test
    public void test1(){
        boolean b = bb.stream()
                .allMatch(x -> x.getAge() == 12);
        System.out.println(b);

        boolean b1 = bb.stream()
                .anyMatch(x -> x.getAge() == 12);
        System.out.println(b1);

        boolean b2 = bb.stream()
                .noneMatch(x -> x.getAge() == 19);
        System.out.println(b2);

        Optional<Student> first = bb.stream()
                .sorted((x, y) -> x.getAge().compareTo(y.getAge()))
                .findFirst();
        System.out.println(first.get());

        Optional<Student> any = bb.stream()
                .filter(x -> x.getPrice().compareTo(BigDecimal.valueOf(5000)) > 0)
                .findAny();
        System.out.println(any.get());

        long count = bb.stream()
                .filter(x -> x.getPrice().compareTo(BigDecimal.valueOf(5000)) > 0)
                .count();
        System.out.println(count);

        Optional<Integer> max = bb.stream()
                .map(Student::getAge)
                .max((x, y) -> x.compareTo(y));
        System.out.println(max);

        Optional<Student> min = bb.stream()
                .min((x, y) -> x.getAge().compareTo(y.getAge()));
        System.out.println(min.get());
    }

    /**
     * reduce 归约
     */
    @Test
    public void test2(){
        //从零开始加
        Integer ages = bb.stream()
                .map(Student::getAge)
                .reduce(0, (x, y) -> x + y);
        System.out.println(ages);

        //没有初始的数
        Optional<Integer> reduce = bb.stream()
                .map(Student::getAge)
                .reduce((x, y) -> x + y);
        System.out.println(reduce.get());
    }

    /**
     * collect
     * 返回集合
     */
    @Test
    public void test3(){
        List<Integer> collect = bb.stream()
                .map(Student::getAge)
                .collect(Collectors.toList());
        collect.forEach(System.out::println);

        Map<String, BigDecimal> collect1 = bb.stream()
                .collect(Collectors.toMap(x -> x.getName(), x -> x.getPrice()));
        Set<Map.Entry<String,BigDecimal>> entrySet = collect1.entrySet();
        for(Map.Entry<String,BigDecimal> entry:entrySet){
            System.out.println(entry.getKey()+"=="+entry.getValue());
        }

        HashSet<Student> collect2 = bb.stream()
                .collect(Collectors.toCollection(HashSet::new));
        collect2.forEach(System.out::println);
    }
    /**
     * collect
     * 最大值  最小值  总和  平均值  总个数
     */
    @Test
    public void test4(){
        Optional<BigDecimal> collect = bb.stream()
                .map(Student::getPrice)
                .collect(Collectors.minBy((x, y) -> x.compareTo(y)));
        System.out.println(collect.get());

        Optional<BigDecimal> collect1 = bb.stream()
                .map(Student::getPrice)
                .collect(Collectors.maxBy((x, y) -> x.compareTo(y)));
        System.out.println(collect1.get());

        Double collect3 = bb.stream()
                .map(Student::getPrice)
                .collect(Collectors.summingDouble(x -> Double.valueOf(x.toString())));
        System.out.println(collect3);

        Double collect4 = bb.stream()
                .map(Student::getPrice)
                .collect(Collectors.averagingDouble(x -> Double.valueOf(x.toString())));
        System.out.println(collect4);

        Long collect5 = bb.stream()
                .collect(Collectors.counting());
        System.out.println(collect5);

        DoubleSummaryStatistics collect2 = bb.stream()
                .map(Student::getPrice)
                .collect(Collectors.summarizingDouble(x -> Double.valueOf(x.toString())));
        System.out.println(collect2.getAverage());
        System.out.println(collect2.getCount());
        System.out.println(collect2.getSum());
        System.out.println(collect2.getMax());
        System.out.println(collect2.getMin());

    }

    /**
     * collect
     * 分组
     */
    @Test
    public void test5(){
        //分组
        Map<Integer, List<Student>> collect = bb.stream()
                .collect(Collectors.groupingBy((e) -> e.getAge()));
        for(Map.Entry<Integer,List<Student>> entry: collect.entrySet()){
            System.out.println("分组的key"+entry.getKey());
            entry.getValue().forEach(System.out::println);
        }

        //多级分组
        Map<Integer, Map<BigDecimal, List<Student>>> collect1 = bb.stream()
                .collect(Collectors.groupingBy(e -> e.getAge(), Collectors.groupingBy(e -> e.getPrice())));
        System.out.println(collect1);
    }

    /**
     * collect
     * 分区
     */
    @Test
    public void test6(){
        Map<Boolean, List<Student>> collect = bb.stream()
                .collect(Collectors.partitioningBy((e) -> e.getAge() > 12));
        for(Map.Entry<Boolean,List<Student>> entry : collect.entrySet()){
            System.out.println("分组的key"+entry.getKey());
            entry.getValue().forEach(System.out::println);
        }
    }

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